我是log4net
的新手,我只是想在控制台行应用程序中熟悉它。首先,我从几个教程中注意到,总体配置略有不同,所以可能是我没有正确设置。
控制台打印得很好,但我正在学习的教程将文件放在控制台应用程序的同一目录中。我发现我必须给它一条明确的路径,让它进入我的项目。
这是我的程序.cs
static void Main(string[] args)
{
XmlDocument log4netConfig = new XmlDocument();
log4netConfig.Load(File.OpenRead("log4net.config"));
var repo = LogManager.CreateRepository(Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy));
XmlConfigurator.Configure(repo, log4netConfig["log4net"]);
var logger = LogManager.GetLogger(typeof(Program));
logger.Error("Hello, World!");
}
这是我的配置
<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="c:usersdpgdeveloperTestLoggingTestLog4Netloggingfun.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="25MB" />
<lockingmodel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
</log4net>
您可以使用工作文件夹的相对路径
<file value="ErrorLog.txt"/>
用于将其保存到窗口位置,例如LOCALAPPDATA
<file type="log4net.Util.PatternString" value="${LOCALAPPDATA}TempLogApp.log" />
如果使用.NET核心和类似这样的环境变量:
<file type="log4net.Util.PatternString" value="${LOCALAPPDATA}TempLogApp.log" />
日志文件将以App/bin/debug/${LOCALAPPDATA}\Temp\log\App.log 结尾
我找到了一种解决这个问题的方法,即使用GlobalContext属性。
在代码中:
log4net.GlobalContext.Properties["LocalAppData"] = Environment.GetEnvironmentVariable("LOCALAPPDATA");
var repository = LogManager.GetRepository(Assembly.GetCallingAssembly());
XmlConfigurator.Configure(repository, new FileInfo("App.config"));
在应用程序配置中
<appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
<param name="StaticLogFileName" value="true" />
<file type="log4net.Util.PatternString" value="%property{LocalAppData}TempLogApp.log" />
<appendToFile value="true" />
<encoding value="utf-8" />
<rollingStyle value="Date" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%appdomain] [%thread] %-5level %logger - %message%newline%exception%newline" />
</layout>
</appender>
那些希望将文件路径设置为Project根目录路径的人可以参考以下代码。我已经在.NET 5 API项目中实现了这一点
Log4net.config文件的更改。记住type="log4net.Util.PatternString"
这条线是非常重要的
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="%property{LoggerFilePath}Logsserver.log" />
<appendToFile value="true" />
<maximumFileSize value="100KB" />
<maxSizeRollBackups value="2" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %5level %logger.%method [%line] - MESSAGE: %message%newline %exception" />
</layout>
</appender>
然后,在Program.cs
文件中
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging((context,loggerBuilder) =>
{
log4net.GlobalContext.Properties["LoggerFilePath"] = context.HostingEnvironment.ContentRootPath;
loggerBuilder.ClearProviders();
loggerBuilder.AddLog4Net();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
干杯!