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 工作进程正确访问的权限。 对于相对路径,我希望日志文件位于项目级别: @Blankman 我遇到了类似的问题。问题不是路径或权限,而是我忘记调用配置来启动日志记录。请参阅其他堆栈溢出问题的答案。 ***.com/questions/20512548/…【参考方案2】:

我认为您的示例正在保存到您的项目文件夹中,除非默认的 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 指定 &lt;file value=...&gt; 时,它确实仍然默认为 \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&lt;FileAppender&gt;().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 将在哪里创建此日志文件?的主要内容,如果未能解决你的问题,请参考以下文章

log4net 创建日志文件但不写入

Log4net 不将日志写入日志文件

Log4net 在记录几秒钟后将日志路径更改为安装文件夹。这是为啥?

如何使用 log4net 日志框架

C#中使用Log4记录日志

调用 log4net 包装器方法后未在日志中获取文件名和行号