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


76

当我将文件值设置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

Answers:


67

如果希望将日志文件放置在运行时决定的指定位置,则该文件可能是您的项目输出目录,则可以.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();

有多简单?:)


2
大招,它有助于把所有的配置在同一个地方:)
晃龙

1
如果要在一个程序中使用多个日志文件,而每个日志文件都在运行时确定不同的路径怎么办?有没有一种方法可以不在某些全局共享上下文中设置属性LogFileName?
吉米

还有其他模式,比如%日期{},可一旦你申请的log4net.Util.PatternString类型一起使用:logging.apache.org/log4net/log4net-1.2.11/release/sdk/...
贾斯汀

51

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

您可以在应用程序的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>

文件标签指定位置。


16
+1直接回答问题“ log4net将在哪里创建此日志文件?”的唯一答案。
基思

5
嗨,Oladipo,对我来说,没有路径定义日志是在bin文件夹中创建的。
Pompair

20

该文件值可以是绝对路径,例如“ c:\ logs \ log.txt”,也可以是相对路径,我相信它是相对于bin目录的。

至于实现它,我通常将以下内容放在我计划登录的所有类的顶部:

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

最后,您可以像这样使用它:

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

4
嗯..它似乎没有在任何地方创建日志文件,并且我没有收到任何错误?
Blankman

2
听起来像是权限问题。我会将配置映射到Web目录之外的绝对路径。之后,请确保日志文件和文件夹具有允许asp.net worker进程正确访问的权限。
葡萄园(Ben.Vineyard)2010年

对于相对路径,我希望日志文件位于项目级别:<file value =“ ../../log.text” />
Dave Mateer

@Blankman我有一个类似的问题。问题不是路径或权限,而是我忘记了调用configure来启动日志记录。请查看其他堆栈溢出问题的答案。stackoverflow.com/questions/20512548/...
午睡

10

Log4net将保存到您的项目文件夹中。类似于:\SolutionFolder\ProjectFolder\bin\SolutionConfiguration\logs\log-file.txt

哪里:

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

希望这可以帮助!


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存储库= log4net.LogManager.GetAllRepositories()。FirstOrDefault();
Louis Somers

2
该存储库已经在这里:yourlogger.Logger.Repository。因此,您可以这样做:yourlogger.Info($"Logfile opened: {m_Logger.Logger.Repository.GetAppenders().OfType<FileAppender>().FirstOrDefault()?.File}");。请注意,如果出现问题,它不会中断null
尼古拉斯

4

对于日志文件夹和文件内容,请使用@Bens answer

我将在创建日志部分中发表评论。伊莫没有正确的方法。当手动对记录器进行编码时,我会按照您的操作方式进行操作:

ILog logger = LogManager.GetLogger(typeof(CCController));

因为它简短明了。

就是说,这些天我不在类中创建logger实例,我让IoC容器为我注入它


0

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

我将首先创建日志文件夹,并向iis用户授予完全权限,然后查看是否正在创建日志文件。


0

如果要动态选择日志文件的路径,请使用此link:方法编写的动态选择日志文件路径的方法

如果您愿意,可以这样设置应用EXE文件所在的路径-

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

然后将此“ logFileLocation”发送到上面的链接中编写的方法中,如下所示:

Initialize(logFileLocation);

您就可以出发了!:)


0

我正在使用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"));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.