我正在尝试实现自定义log4net logger/logmanager,以便我可以添加一个新级别.我还想让目标表的模式(我使用AdoNetAppender和SQL Server 2008)有一些可选字段; 例如,我添加的级别用于跟踪使用情况,其中一个字段需要是持续时间(告诉我们需要多长时间).但是,其他级别(INFO,DEBUG,FATAL等)对于Duration不具有任何值.所以我需要能够插入表中并不是所有具有值的字段 - 最好不必重新实现所有标准级别的日志记录,以便为不相关的字段传递空值.理想情况下,对于特定日志记录事件无法找到的属性值,log4net会自动传递NULL.
我的自定义记录器中的代码如下:
public void Usage(TimeSpan? duration, DateTime? startTime, DateTime? endTime, string message)
{
if (IsUsageEnabled)
{
LoggingEvent loggingEvent = new LoggingEvent(GetType(), Logger.Repository, Logger.Name, _currentUsageLevel,
message, null);
if (startTime.HasValue)
{
loggingEvent.Properties["StartTime"] = startTime.Value;
}
else
{
loggingEvent.Properties["StartTime"] = DBNull.Value;
}
if (endTime.HasValue)
{
loggingEvent.Properties["EndTime"] = endTime.Value;
}
else
{
loggingEvent.Properties["EndTime"] = DBNull.Value;
}
if (duration.HasValue)
{
loggingEvent.Properties["Duration"] = duration.Value.TotalMilliseconds;
}
else
{
loggingEvent.Properties["Duration"] = DBNull.Value;
}
Logger.Log(loggingEvent);
}
}
Run Code Online (Sandbox Code Playgroud)
(添加了对DBNull.Value的赋值,希望这可以帮助log4net在未传递值时传递空值,但我希望它们可以被删除).
appender配置如下:
<appender name="SQLAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize …Run Code Online (Sandbox Code Playgroud) 我有一个使用log4net进行日志记录的框架,我知道我们可以通过config文件禁用或启用所需的log4net日志记录。我想开发一些设置类,以便管理员或用户可以设置日志记录等。log4net中的类等是什么,以获取配置文件并通过代码更改配置文件中的设置?(有没有,或者我应该使用.net System.Xml)有任何代码片段吗?
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<root>
<level value="ALL" />
<!--<appender-ref ref="LogFileAppender" />-->
<!--<appender-ref ref="ConsoleAppender" />-->
<appender-ref ref="DEBUG-RollingLogFileAppender" />
<appender-ref ref="Error-RollingLogFileAppender" />
</root>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
<param name="File" value="log-file.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="[Header]\r\n"/>
<param name="Footer" value="[Footer]\r\n"/>
<param name="ConversionPattern" value="%d [%t] %-5p %c %ndc %P{auth} - %m%n" />
</layout>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c %ndc %P{auth} - %m%n" />
</layout>
</appender>
<appender name="DEBUG-RollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
<param …Run Code Online (Sandbox Code Playgroud) 我的log4net转换模式如下所示
<conversionPattern value="%5level [%thread] (%file:%line) - %message%newline" />
Run Code Online (Sandbox Code Playgroud)
%文件在我的控制台窗口中吐出几乎覆盖整行的完整路径.
我怎样才能得到文件名(减去路径).
现在它看起来像这样
INFO [10] <c:\My Root Dir\Subdir\...........................\filename.cs> - My message
Run Code Online (Sandbox Code Playgroud)
我希望它看起来像
INFO [10] <filename.cs> - My message
Run Code Online (Sandbox Code Playgroud)
谢谢
我用smtpAppender(gmail)配置了log4net.奇怪的问题是,当我在IIS 7.5上部署应用程序时,smtpAppender无法正常工作.
我尝试使用telnet命令测试与gmail smtp的连接.所以我可以检查是否有任何阻止,但测试工作正常.
我的日志配置:
<log4net>
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<file value="C:\logs\MyLog.log"/>
<appendToFile value="true"/>
<maximumFileSize value="500KB"/>
<maxSizeRollBackups value="2"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %level %logger - %message%newline"/>
</layout>
</appender>
<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender,log4net">
<to value="test1@test.com" />
<from value="test2@test.com" />
<subject value="Error logging message" />
<smtpHost value="smtp.gmail.com" />
<port value="587"/>
<authentication value="Basic" />
<username value="test05@gmail.com"/>
<password value="password"/>
<EnableSsl value="true" />
<bufferSize value="1" />
<lossy value="true" />
<evaluator type="log4net.Core.LevelEvaluator,log4net">
<threshold value="ERROR" />
</evaluator>
<layout type="log4net.Layout.PatternLayout,log4net">
<conversionPattern value="%property{log4net:HostName} :: %level :: %message %newlineLogger: …Run Code Online (Sandbox Code Playgroud) 我想在项目包装器上使用Common.logging和log4net,我在我的日志项目中创建了一个log4net.config文件并配置了我的web.config文件,但是当我尝试记录任何内容时我得到了一个异常(错误,信息等) ).我认为问题出在web.config文件中,但我检查了,我没有看到任何错误.
异常错误是
为common/logging创建配置节处理程序时出错:无法创建类型'Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter,Common.Logging.Log4Net
DLL的
Common.Logging.2.0.0
Common.Logging.Log4Net.2.0.1
log4net.1.2.10
Run Code Online (Sandbox Code Playgroud)
包装类
using System;
using System.Diagnostics;
using Common.Logging;
using System.Reflection;
namespace LoggerL
{
public class Logger
{
private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
//static Logger()
//{
// XmlConfigurator.Configure();
//}
public static void Info(string msg = "")
{
var method = new StackFrame(1).GetMethod();
var name = method.DeclaringType.FullName + "." + method.Name + "(";
foreach (var item in method.GetParameters())
{
name += item.ParameterType.Name + " " + item.Name + ", ";
}
name = …Run Code Online (Sandbox Code Playgroud) 我正在将Log4Net事件插入SQL数据库.Message和Exception字段都是8000个字符,但偶尔会有一个超过8000个字符的事件,并且数据会被截断.
是否有任何可配置的方法来将事件分成多行?如果没有,我正在考虑实现我自己的ILog,它自动处理日志记录事件的分块,所以我没有得到任何截断的数据.有没有人有更好的主意?
这是我当前的参数配置:
<parameter>
<parameterName value="@message"/>
<dbType value="String"/>
<size value="8000"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message"/>
</layout>
</parameter>
<parameter>
<parameterName value="@exception"/>
<dbType value="String"/>
<size value="8000"/>
<layout type="log4net.Layout.ExceptionLayout"/>
</parameter>
Run Code Online (Sandbox Code Playgroud)
数据库表定义如下:
[Message] [nvarchar](max) NULL,
[Exeception] [ntext] NULL,
Run Code Online (Sandbox Code Playgroud) 我有一个"有趣"的问题,如果log4net来自ASP.NET MVC中的工作线程,它们不会写日志消息.当我添加<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />到我的log4net配置以及网站在我的服务器(IIS 8.0)上运行时,这似乎只是一个问题.在我自己的计算机上,log4net可以很好地记录消息 - 即使使用MinimalLock配置,如果我删除了这个'MinimalLock',它也会在服务器上的工作线程中记录消息.
这是一个例子:
public class MvcApplication : System.Web.HttpApplication
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
protected void Application_Start()
{
// This is logged just fine - with or without MinimalLock,
// both local and on server
log.Info("Logging ouside worker!");
// This is only logged without MinimalLock configured
// if the site is hosted on my server runnning IIS 8.0.
var thread = new Thread(() => log.Info("Logging inside worker!"));
thread.Start(); …Run Code Online (Sandbox Code Playgroud) 第二组眼睛可以有人吗?我显然遗漏了一些东西.
我在Web API应用程序中使用Log4Net.每当我调用一个Log.Error()时它就会执行,但实际上没有任何内容写入我的dbo.Log表.我正在运行本地数据库.当我用一个写入文件的配置替换配置时,代码工作得很好.
这是我的配置和代码的样子.
Log4Net.config文件包含以下内容:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="100" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="Data Source=MUD-DAD\SQLEXPRESS;Initial Catalog=FitAchiever;Persist Security Info=True;User ID=sa;Password=asdadf334"/>
<commandText value="INSERT INTO dbo.Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter> …Run Code Online (Sandbox Code Playgroud)我的log4net配置如下所示:
<log4net>
<appender name="CloudWatchLogsAppender" type="CloudWatchAppender.CloudWatchLogsAppender, CloudWatchAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger.%method - %message%newline" />
</layout>
<groupName value="agroupname" />
<streamName value="astreamname" />
</appender>
<root>
<level value="INFO" />
<appender-ref ref="CloudWatchLogsAppender" />
</root>
<logger name="Amazon">
<level value="OFF" />
</logger>
</log4net>
Run Code Online (Sandbox Code Playgroud)
在类中,我用log实例化记录器
private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
Run Code Online (Sandbox Code Playgroud)
并调用Log.Error(消息); 只有一次,但在我的日志中,所有错误都是重复的.此外,在WebApi项目的控制器类中调用此方法.
我已经读过其他问题,当使用多个记录器并将消息传播到根记录器时会发生这种情况,但是,我在这个实例中只使用了根记录器.
最近我有一个问题使Log4Net工作(在这里描述)但在那之后它没关系.
我已经离开了这一段时间,因为我需要开发一些模块,我让日志记录稍微落后了.现在,我看,我甚至尝试更改日志文件的名称和位置(静态设置),它创建它,但在两种情况下都没有写任何东西.
这是我的log4Net配置文件:
<?xml version="1.0"?>
<configuration>
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
<appender name="console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %level %logger - %message%newline" />
</layout>
</appender>
<appender name="file" type="log4net.Appender.RollingFileAppender">
<file value="ApplicationLogging.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
</log4net>
</configuration>
Run Code Online (Sandbox Code Playgroud)
这是我的Global.asax
[assembly: XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
XmlConfigurator.Configure();
ILog logger …Run Code Online (Sandbox Code Playgroud) c# log4net log4net-configuration audit-logging entity-framework-6