log4net 将在哪里创建此日志文件?
Posted
技术标签:
【中文标题】log4net 将在哪里创建此日志文件?【英文标题】:Where will log4net create this log file? 【发布时间】:2011-02-18 10:41:42 【问题描述】:当我将文件值设置为logs\log-file.txt
时,它将在哪里创建此文件夹?在/bin
目录中?
我的 web.config 如下所示:
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="logs\log-file.txt" />
<appendToFile value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%propertyNDC] - %message%newline" />
</layout>
</appender>
</log4net>
这是正确的记录方式吗:
ILog logger = LogManager.GetLogger(typeof(CCController));
logger.Error("Some Page", ex); // where ex is the exception instance
【问题讨论】:
【参考方案1】:文件值可以是像“c:\logs\log.txt”这样的绝对路径,也可以是相对于 bin 目录的相对路径。
就实施而言,我通常将以下内容放在我计划登录的任何课程的顶部:
private static readonly ILog Log = LogManager.GetLogger(
MethodBase.GetCurrentMethod().DeclaringType);
最后,你可以这样使用它:
Log.Debug("This is a DEBUG level message.");
【讨论】:
hmm..它似乎没有在任何地方创建日志文件,我没有收到任何错误? 听起来像是权限问题。我会将配置映射到您的 Web 目录之外的绝对路径。然后,确保日志文件和文件夹具有允许 asp.net 工作进程正确访问的权限。 对于相对路径,我希望日志文件位于项目级别:我认为您的示例正在保存到您的项目文件夹中,除非默认的 iis 或 .NET 用户具有创建权限,否则它将无法创建日志文件夹。
我会先创建日志文件夹并允许 iis 用户完全权限,然后查看是否正在创建日志文件。
【讨论】:
【参考方案3】:对于日志文件夹和文件,请使用@Bens answer。
不过,我将评论创建日志部分。海事组织没有正确方式。手动编码记录器时,我会按照您的方式进行:
ILog logger = LogManager.GetLogger(typeof(CCController));
因为它简短而简洁。
也就是说,这些天我没有在类中创建记录器实例,I let my IoC container inject it for me。
【讨论】:
【参考方案4】:Log4net 正在保存到您的项目文件夹中。比如:\SolutionFolder\ProjectFolder\bin\SolutionConfiguration\logs\log-file.txt
。
地点:
SolutionFolder 是您保存解决方案的位置 ProjectFolder 是您的项目在解决方案中所在的文件夹,并且 SolutionConfiguration 是包含项目所有二进制文件的文件夹(默认为 Debug 或 Release)希望这会有所帮助!
【讨论】:
我意识到这是 9 年后的事了,但这个答案对我来说是最清楚的。当您没有为 appender 指定<file value=...>
时,它确实仍然默认为 \solutionName\projectName\bin\Debug
我的问题是,这样可以吗? IE。将日志文件与二进制文件放在同一目录中是一种好习惯吗?【参考方案5】:
如果您希望将日志文件放置在将在运行时确定的指定位置,该位置可能是您的项目输出目录,那么您可以通过这种方式配置您的 .config
文件条目
<file type="log4net.Util.PatternString" value="%propertyLogFileName.txt" />
然后在调用log4net configure
之前的代码中,如下设置新路径
log4net.GlobalContext.Properties["LogFileName"] = @"E:\\file1"; //log file path
log4net.Config.XmlConfigurator.Configure();
它有多简单? :)
【讨论】:
很棒的技巧,它有助于将所有配置放在一个地方:) 如果你想在一个程序中有多个日志文件,每个文件在运行时确定的不同路径中怎么办?有没有办法在某些全局共享上下文中设置属性 LogFileName? 应用 log4net.Util.PatternString 类型后,还可以使用其他模式,例如 %date:logging.apache.org/log4net/log4net-1.2.11/release/sdk/…【参考方案6】:它将在您的项目/解决方案的根目录中创建文件。
您可以在应用的 web.config 中指定选择的位置,如下所示:
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="c:/ServiceLogs/Olympus.Core.log" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value=".yyyyMMdd.log" />
<maximumFileSize value="5MB" />
<staticLogFileName value="true" />
<lockingModel type="log4net.Appender.RollingFileAppender+MinimalLock" />
<maxSizeRollBackups value="-1" />
<countDirection value="1" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level [%thread] %logger - %message%newline%exception" />
</layout>
</appender>
文件标签指定位置。
【讨论】:
+1 直接回答“log4net 将在哪里创建此日志文件?”问题的唯一答案 嗨 Oladipo,对我来说,没有路径定义日志是在 bin 文件夹中创建的。【参考方案7】:FileAppender appender = repository.GetAppenders().OfType<FileAppender>().FirstOrDefault();
if (appender != null)
logger.DebugFormat("log file located at : 0", appender.File);
else
logger.Error("Could not locate fileAppender");
【讨论】:
ILoggerRepository 存储库 = log4net.LogManager.GetAllRepositories().FirstOrDefault(); 存储库已经在这里:yourlogger.Logger.Repository
。所以你可以这样做:yourlogger.Info($"Logfile opened: m_Logger.Logger.Repository.GetAppenders().OfType<FileAppender>().FirstOrDefault()?.File");
。请注意,如果是 null
,它不会中断。【参考方案8】:
如果您想动态选择日志文件的路径,请使用此链接中编写的方法:method to dynamic choose the log file path。
如果您愿意,您可以像这样设置应用 EXE 文件所在的路径 -
var logFileLocation = System.IO.Path.GetDirectoryName
(System.Reflection.Assembly.GetEntryAssembly().Location);
然后将此“logFileLocation”发送到上面链接中编写的方法,如下所示:
Initialize(logFileLocation);
你准备好了! :)
【讨论】:
【参考方案9】:我正在使用 log4net 2.0.8 为 .NET core 2.1 进行开发,发现 NealWalters 代码抱怨 XmlConfigurator.Configure() 的参数为 0。我找到了 Matt Watson here
的解决方案 log4net.GlobalContext.Properties["LogFileName"] = @"E:\\file1"; //log file path
var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));
【讨论】:
【参考方案10】:在您的情况下,日志文件将位于 bin\Debug\netcoreapp3.1\
文件夹中
这也可能取决于您的框架。
我用的是 Asp.Net core 3.1 所以文件夹路径是bin\Debug\netcoreapp3.1\
【讨论】:
以上是关于log4net 将在哪里创建此日志文件?的主要内容,如果未能解决你的问题,请参考以下文章