2009-02-23 17 views
20

我正在嘗試將日期添加到我的日誌文件名中,並且能夠通過遵循我在stackoverflow中找到的一些建議來使其工作。一切正常,但由於某種原因,第一個文件總是附加兩次日期。爲什麼在使用Log4Net時日期附加了兩次文件名?

例如,而不是log.2009-02-23.log,我得到log.2009-02-23.log.2009-02-23.log

我發現它很奇怪和fyi,這是一個非常簡單的代碼。這不像我在多線程環境中運行它。

我log4net的配置:

<log4net> 
<appender name="MyLog" type="log4net.Appender.RollingFileAppender"> 
    <file value="../../Logs/Mylog"/> 
    <staticLogFileName value="false" /> 
    <appendToFile value="true"/> 
    <rollingStyle value="Date"/> 
    <datePattern value=".yyyy-MM-dd.lo\g" /> 
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d{DATE} [%t] %-5p %c - %m%n"/> 
    </layout> 
</appender> 
<root> 
    <level value="INFO"/> 
    <appender-ref ref="MyLog"/> 
</root> 
</log4net> 

任何想法,爲什麼? 。

編輯:我想加入我在這個測試環境中的信息
- asp.net
- .NET框架2.0
- 在Windows Server 2003 64位Service Pack 2的
- log4net 1.2.10

回答

5

這是一個權限問題。至少這就是發生在我身上的事情。

我是新使用Log4Net,所以我不知道它有內部日誌記錄,但我發現它,所以我試着打開internal logging。 我不是很確定它說的是什麼,但它看起來像是在做什麼: 1.追加日期到文件名。 2.嘗試訪問要寫入的文件(失敗)。 3.將日期追加到文件名再次。 4.成功訪問文件(其中有奇怪的文件名現在)

在我知道這一點之前,我谷歌解決這個問題的關鍵字,就像我在這個stackoverflow問題上有一個標題。那裏沒有那麼多的信息。我發現也許有一個人說這是發生在某些人身上,但從來沒有真正解釋過爲什麼或解決方案。有了這些新的信息(來自Log4Net的內部錯誤信息),我一直在尋找來自搜索引擎的不同線程。我發現這可能是一個權限問題。

看來寫入應用程序沒有足夠的權限到日誌文件夾。應用程序的默認身份通常是NETWORK_SERVICE。在給予文件夾更多權限(我完全控制它,但我不知道最小化它是如何工作的)後,它工作得很好。

如果有人能比我更好地解釋這一點,請隨時編輯。

0

嘗試<datePattern value=".yyyy-MM-dd.lo\g" />我不明白\ g是什麼。

+1

datePattern標籤接受日期和時間格式化的字符串作爲值。 「g」是一個有效的日期和時間格式模式(谷歌DateTimeFormatInfo),所以我必須「逃避」它,所以它不會被解釋。 – 2009-02-23 23:41:49

+0

你能告訴我更多關於你正在使用的log4net的版本和你環境的其他部分(os,.net版本等)。我從來沒有遇到過不得不從日誌中逃脫的問題。 – olle 2009-02-24 00:48:33

+0

- Windows Server 2003 x64 Service Pack 2 - .NET Framework 2.0 - log4net 1.2.10 關於必須轉義g,請查看我對devinb的評論。 – 2009-02-24 18:26:14

1

正如olle指出的那樣。你的問題與'\ g'有關,你的log4net將它解釋爲另一個dateformat。 嘗試刪除 「.yyyy-MM-dd.lo \ G」,並以 「YYYY-MM-DD」

的 「.LOG」 中的日期格式不屬於

1

我用它替換以下:

<param name="DatePattern" value="yyyy.MM.dd.\l\o\g"/> 

有了這個,我得到這樣的文件名:2009.02.23.log

10

如果初始化日誌系統時訪問日誌文件時出現問題,則會發生這種情況。 如果您在運行程序的同時運行另一個副本並寫入日誌文件,或者如果在文本編輯器中編輯日誌文件,則可能會發生這種情況。基本上任何在log4net init運行時會導致日誌文件寫鎖定的東西。

檢查你的代碼重複調用log4net初始化 - 也許你是在一個構造函數初始化,而不是在單例的靜態構造函數或全局初始化,例如。

如果您在「網絡花園」配置中運行,並且不在文件名中包含PID,也會發生這種情況,因爲每個不同的Web服務器進程都會嘗試寫入相同的文件。如果使用Web花園並寫入文件,請將該pid添加到文件名模式,以便每個服務器進程都有自己的文件。

1

我遇到了同樣的問題。對我而言,它是將RollingFileAppender用於測試日誌,並使用ReSharper運行NUnit測試的組合。

事實證明,ReSharper的使用過程運行測試:

2 TaskRunners

其上創建日誌文件的競爭條件。現在

,如果我們更改日誌文件名包含進程ID:

<appender name="MyLog" type="log4net.Appender.RollingFileAppender"> 
    <file type="log4net.Util.PatternString" value="MyLog.pid.%processid" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Composite" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="10MB" /> 
    <staticLogFileName value="false"/> 
    <datePattern value="_yyyy-MM-dd'.log'"/> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%d{HH:mm:ss.fff} [%15.15t] %-5p '%40.40c' - %m%n" /> 
    </layout> 
</appender> 

問題就解決了。每個文件都有自己獨特的名字:

MyLog.pid.5440_2010-10-13.log
MyLog.pid.1496_2010-10-13.log

注意使用PatternString爲'類型'。

希望有所幫助。

相關問題