我理解为什么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文件.甚至不是我变成流的嵌入式资源.我的目标是完全以编程方式定义记录器.只是好奇是否有可能,如果是这样,我可能会找到一个语法示例.
我对Log4net完全不熟悉.
我已经设法通过添加配置文件和简单的日志记录来实现目标.
我已经硬编码了这个值,"C:\temp\log.txt"但这还不够好.
日志必须转到特殊文件夹
path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
Run Code Online (Sandbox Code Playgroud)
并且此路径会根据您使用的是Windows Server 2008还是Windows XP或Vista等而变化...
如何以编程方式在log4net中更改文件的位置?
这就是我所做的:
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
</configSections>
<log4net>
<root>
<level value="DEBUG" />
<appender-ref ref="LogFileAppender" />
</root>
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="C:\temp\log.txt" />
<param name="AppendToFile" value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />
</layout>
</appender>
</log4net>
Run Code Online (Sandbox Code Playgroud)
class Program
{
protected static readonly ILog log = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
log4net.Config.XmlConfigurator.Configure(); …Run Code Online (Sandbox Code Playgroud) 我正在寻找有关在我的ASP.NET应用程序中动态重新配置Log4Net日志记录级别的最佳方法的提示.我通常使用简单配置,其中根记录器定义默认日志记录级别,例如
<log4net>
<root>
<level value="INFO" />
<appender-ref ref="..." />
<appender-ref ref="..." />
... etc ...
</root>
... etc
Run Code Online (Sandbox Code Playgroud)
并且可能有几个appender,每个appender都有过滤器来定义他们使用的日志记录级别.
我希望能够做的第一件事是允许管理员连接到一个管理页面,使他们能够(a)查看根记录器的当前级别,以及(b)动态更改它.我不想使用"ConfigureAndWatch"并写入磁盘上的配置文件,因为我不希望在应用程序被回收时这些更改仍然存在.
接下来我想更进一步,在Admin页面上能够显示一个TreeView,其中包含应用程序中存在的所有当前Logger及其当前日志记录级别.并允许管理员能够在层次结构的任何级别有选择地更改日志记录级别.
我的想法是创建一个通用管理页面,我可以将其放入我的所有应用程序中,使管理员能够动态选择性地启用DEBUG级别的日志记录以进行故障排除.
我发现Log4Net API有点令人困惑,任何人都可以指向样本或显示实现此目的的最佳方法.
更新:
两个答案都同样好,所以我接受了第一个 - 谢谢.为了重新开始,我可以获得所有当前的记录器,如下所示:
foreach (log4net.ILog log in log4net.LogManager.GetCurrentLoggers())
{
log4net.Repository.Hierarchy.Logger logger =
(log4net.Repository.Hierarchy.Logger)log.Logger;
Debug.WriteLine(
String.Format("{0} Parent {1} Level {2} EffectiveLevel {3}<br>",
logger.Name,
logger.Parent.Name,
logger.Level == null ? "<null>" : logger.Level.Name,
logger.EffectiveLevel
)
);
}
Run Code Online (Sandbox Code Playgroud)
EffectiveLevel是有效级别 - 如果后者不为null,则与Level相同,否则从父级继承.
上面返回的至少一个记录器将根记录器作为父记录器,这使我能够获得对根记录器的引用.
通过上述内容,应该可以重建记录器层次结构.
更新2
再次感谢.我已经实现了一个ASP.NET服务器控件,它在带有复选框的TreeView中显示记录器层次结构,并允许用户动态更改层次结构中任何节点的日志记录级别.效果很好,我将把它放在所有ASP.NET Web和Web服务应用程序的管理页面上!