我一直都在使用log4net,但有一点我从未弄清楚的是如何判断内部发生了什么.例如,我的项目中有一个控制台appender和一个数据库appender.我对数据库和代码做了一些更改,现在数据库appender不再起作用了.我会弄清楚为什么最终,但如果我能看到log4net里面发生了什么,那将会有很大帮助.
log4net是否生成任何类型的输出,我可以查看以尝试确定问题的根源?
我使用Log4net创建了一个简单的场景,但似乎我的appender不起作用,因为消息没有添加到日志文件中.
我将以下内容添加到web.config文件中:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/>
</configSections>
<log4net>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<file value="D:\MyData\Desktop\LogFile.txt" />
<appendToFile value="true" />
<encoding value="utf-8" />
<layout type="log4net.Layout.SimpleLayout" />
</appender>
<root>
<level value="INFO" />
<appender-ref ref="LogFileAppender" />
</root>
</log4net>
Run Code Online (Sandbox Code Playgroud)
在全局ASAX文件中,我添加了:
ILog logger = LogManager.GetLogger(typeof(MvcApplication));
Run Code Online (Sandbox Code Playgroud)
并在Application_Start方法中:
logger.Info("Starting the application...");
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
我理解为什么log4net使用app.config
文件来设置日志记录 - 这样您就可以轻松更改信息的记录方式,而无需重新编译代码.但在我的情况下,我不想app.config
用我的可执行文件打包文件.我不想修改我的日志记录设置.
有没有办法让我设置登录代码而不是使用app.config
?
这是我的简单配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="Logs\EventLog.txt" />
<appendToFile value="false" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="1GB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<appender name="MemoryAppender" type="log4net.Appender.MemoryAppender">
</appender>
<root>
<level value="Info" />
<appender-ref ref="RollingLogFileAppender" />
<appender-ref ref="MemoryAppender" />
</root>
</log4net>
</configuration>
Run Code Online (Sandbox Code Playgroud)
编辑:
要完全清楚:我的目标是没有XML文件.甚至不是我变成流的嵌入式资源.我的目标是完全以编程方式定义记录器.只是好奇是否有可能,如果是这样,我可能会找到一个语法示例.
我想从同一个进程写入2个不同的日志文件.
使用log4net可以做什么?
我需要为每个日志文件写单独的消息.如何将消息写入特定的appender?
嘿,我在web.config中有这个配置
<log4net>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<param name="File" value="mylog.log" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="" />
<param name="Footer" value="" />
<param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
</layout>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<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 %m%n" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="LogFileAppender" />
<appender-ref ref="ConsoleAppender" />
</root>
</log4net>
Run Code Online (Sandbox Code Playgroud)
但log4net无法正常工作.我的项目编译得很好,我也没有调试错误.我告诉的行log.debug("somemessage")
可以正常运行,但我找不到mylog.log
文件,所以它在哪里?
这个网站说
可以为记录器分配级别.级别是log4net.Core.Level类的实例.以优先级递增的顺序定义以下级别:
- 所有
- DEBUG
- 信息
- 警告
- 错误
- 致命
- 关闭
DEBUG似乎具有最低优先级,ERROR更高.
题
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="ERROR"/>
<param name="LevelMax" value="ERROR"/>
</filter>
Run Code Online (Sandbox Code Playgroud)
而不是最小和最大过滤器.是否可以配置级别并包括其下的所有其他级别以进行日志记录.
示例 - 将级别设置为错误,它将包括DEBUG,INFO,WARN和ERROR.这可能与log4net一起使用吗?
根据其中一条评论发布log4net配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections >
<log4net debug="true">
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<layout type="log4net.Layout.XMLLayout" /> -->
<param name="File" value="TestLog.log" />
<param name="AppendToFile" value="false" />
<layout type="log4net.Layout.PatternLayout">
<header type="log4net.Util.PatternString" value="[START LOG] %newline" />
<footer type="log4net.Util.PatternString" value="[END LOG] %newline" />
<conversionPattern value="%d [%t] %-5p - …
Run Code Online (Sandbox Code Playgroud) 我想以文件命名为例:
dd.mm.yyyy.log
log4net怎么可能这样?
我们在开发和生产机器上看到一个间歇性问题,我们的日志文件没有被记录.
使用Visual Studio在开发和调试中运行时,我们在VS输出窗口中收到以下log4net错误消息:
log4net:ERROR [RollingFileAppender] Unable to acquire lock on file C:\folder\file.log.
Run Code Online (Sandbox Code Playgroud)
该进程无法访问文件"C:\ folder\file.log",因为它正由另一个进程使用.
log4net:ERROR XmlConfigurator: Failed to find configuration section 'log4net' in the application's .config file.
Check your .config file for the <log4net> and <configSections> elements.
Run Code Online (Sandbox Code Playgroud)
配置部分应如下所示:
<section
name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
Run Code Online (Sandbox Code Playgroud)
我们当前解决此问题的方法是重命名最后一个日志文件.我们当然希望这会失败(由于前面提到的文件锁定),但通常不会.由于aspnet_wp.exe进程的锁定,重命名一次或两次失败.
我们的log4net配置部分如下所示:
<log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\folder\file.log"/>
<appendToFile value="true" />
<datePattern value="yyyyMMdd" />
<rollingStyle value="Date" />
<maximumFileSize value="10MB" />
<maxSizeRollBackups value="100" />
<layout type="log4net.Layout.PatternLayout">
<header value="[Header]
"/>
<footer value="[Footer]
"/>
<conversionPattern value="%date %-5level %logger ${COMPUTERNAME} %property{UserHostAddress} [%property{SessionID}] …
Run Code Online (Sandbox Code Playgroud) 有些人使用的是ELMAH而不是log4net.是什么让它变得更好?
我在回答Stack Overflow问题时发现了ELMAH 如何登录C#?