【问题标题】:Where will log4net create this log file?log4net 将在哪里创建此日志文件?
【发布时间】: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 [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
</log4net>

这是正确的记录方式吗:

ILog logger = LogManager.GetLogger(typeof(CCController));
logger.Error("Some Page", ex);  // where ex is the exception instance

【问题讨论】:

    标签: c# asp.net-mvc logging log4net


    【解决方案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 我遇到了类似的问题。问题不是路径或权限,而是我忘记调用配置来启动日志记录。请参阅其他堆栈溢出问题的答案。 stackoverflow.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="%property{LogFileName}.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\

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-02-12
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多