Log4Net输出文件目录-ASP.NET Core 3.1



我是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>();
});

干杯!

最新更新