log4net会将日志文件创建在哪里?

93
当我将文件值设置为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
10个回答

78
如果您希望将日志文件放置在指定位置,并在运行时决定其位置(例如项目输出目录),则可以通过以下方式配置您的.config文件条目。
<file type="log4net.Util.PatternString" value="%property{LogFileName}.txt" />

然后在调用log4net configure之前的代码中,按照以下方式设置新路径:

并且在调用log4net configure之前的代码中,设置新路径如下。

 log4net.GlobalContext.Properties["LogFileName"] = @"E:\\file1"; //log file path
 log4net.Config.XmlConfigurator.Configure();

它有多简单?:)


2
很棒的技巧,它可以将所有的配置放在一个地方 :) - Hoàng Long
1
如果您想在一个程序中有多个日志文件,每个文件都在运行时确定的不同路径中,该怎么办?是否有一种方法可以在某些全局共享上下文中设置属性LogFileName? - Jimmy
一旦应用log4net.Util.PatternString类型,就可以使用其他模式,例如%date{}:https://logging.apache.org/log4net/log4net-1.2.11/release/sdk/log4net.Util.PatternString.html - Justin

64

它将在您的项目/解决方案的根目录中创建文件。

您可以按照以下方式在您应用程序的 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>

文件标签指定了位置。


20
+1 是唯一直接回答“log4net会在哪里创建日志文件?”这个问题的答案。 - Keith
6
嗨,Oladipo,对我来说,没有路径定义时日志将被创建在 bin 文件夹中。 - Pompair
我和 @pompair 一样。它是在 bin\debug 文件夹中创建的。也就是说,与 exe 相同的文件夹。 - Elroy Flynn

20

文件参数的值可以是绝对路径(例如 "c:\logs\log.txt")或相对路径,我认为这个相对路径是相对于 bin 目录的。

至于如何实现它,我通常会将以下代码放在我打算进行记录的任何类的顶部:

private static readonly ILog Log = LogManager.GetLogger( 
MethodBase.GetCurrentMethod().DeclaringType);

最后,你可以这样使用它:

Log.Debug("This is a DEBUG level message.");

7
嗯...似乎没有在任何地方创建日志文件,而且我也没有收到任何错误信息? - Blankman
2
听起来像是权限问题。我会将配置映射到网站目录之外的绝对路径。之后,确保日志文件和文件夹具有允许asp.net工作进程适当访问的权限。 - Ben.Vineyard
对于相对路径,我希望日志文件位于项目级别:<file value=" ../../log.text" /> - Dave Mateer
@Blankman我遇到了类似的问题。问题不在路径或权限上,而是我忘记调用配置来启动日志记录。请参阅其他堆栈溢出问题的答案。https://dev59.com/FXrZa4cB1Zd3GeqPyh4H - Nap

13

Log4net会将日志保存到你的项目文件夹中,类似这样的路径:\SolutionFolder\ProjectFolder\bin\SolutionConfiguration\logs\log-file.txt

其中:

  • SolutionFolder是你保存解决方案的地方
  • ProjectFolder是解决方案中包含项目的文件夹
  • SolutionConfiguration是包含项目所有二进制文件的文件夹(默认为Debug或Release)

希望这能帮到你!


我知道这已经是9年后的事了,但这个答案对我来说是最清晰的。当您没有为appender指定<file value=...>时,它确实仍然默认为\solutionName\projectName\bin\Debug。我的问题是,这样做是否可以?也就是说,在与二进制文件相同的目录中拥有日志文件是否是一个好的做法? - amy

6
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");

2
ILoggerRepository repository = log4net.LogManager.GetAllRepositories().FirstOrDefault(); ILoggerRepository repository = log4net.LogManager.GetAllRepositories().FirstOrDefault(); - Louis Somers
2
仓库已经在这里:yourlogger.Logger.Repository。所以你可以这样做:yourlogger.Info($"Logfile opened: {m_Logger.Logger.Repository.GetAppenders().OfType<FileAppender>().FirstOrDefault()?.File}");。请注意,如果某些内容为null,它不会中断。 - Nicolas

4
对于日志文件夹和文件的事情,请参考@Bens答案
但是,我将评论创建日志部分。在我看来,没有正确的方法。当手动编写记录器时,我会按照您所做的方式进行操作:
ILog logger = LogManager.GetLogger(typeof(CCController));

之所以这样做是因为它简短而且简明。

话虽如此,现在我不再在类内部创建日志记录器实例,我让我的IoC容器为我注入它


1
我正在使用log4net 2.0.8为.NET Core 2.1开发,发现NealWalters的代码对于XmlConfigurator.Configure()的0个参数感到不满。我在这里找到了Matt Watson的解决方案。
        log4net.GlobalContext.Properties["LogFileName"] = @"E:\\file1"; //log file path
        var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
        XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));

0

我认为你的示例保存在项目文件夹中,除非默认的iis或.NET用户具有创建权限,否则它将无法创建日志文件夹。

我会先创建日志文件夹并允许iis用户拥有完全权限,然后查看是否已创建日志文件。


0
在您的情况下,日志文件将位于 bin\Debug\netcoreapp3.1\ 文件夹中,而且这可能也取决于您的框架。
我使用的是Asp.Net Core 3.1,因此文件夹路径为 bin\Debug\netcoreapp3.1\

0

如果您想动态选择日志文件的路径,请使用此链接中编写的方法:动态选择日志文件路径的方法

如果您希望可以设置应用程序 EXE 文件所在的路径,可以像这样进行设置 -

var logFileLocation = System.IO.Path.GetDirectoryName
(System.Reflection.Assembly.GetEntryAssembly().Location);

然后像这样将“logFileLocation”发送到上面链接中编写的方法:

Initialize(logFileLocation);

你已经准备好了!:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接