Asp.net

log4net 在 IIS7 上部署時不會創建日誌文件

  • August 15, 2017

大家早上好,

當我在本地機器上開發時,我遇到了一個不存在的 log4net 問題,但是一旦我將應用程序部署到伺服器,log4net 就停止了工作。

這是伺服器配置:-Windows XP SP3 -IIS 7 -framework .Net v4

這是網站的web.config中的log4net配置:

<configuration>
     <log4net>
       <root>
         <level value="DEBUG" />
         <appender-ref ref="LogFileAppender" />
       </root>
       <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
         <param name="File" value="log.txt" />
         <param name="AppendToFile" value="true" />
         <rollingStyle value="Size" />
         <maxSizeRollBackups value="10" />
         <maximumFileSize value="30MB" />
         <staticLogFileName value="false" />
         <layout type="log4net.Layout.PatternLayout">
           <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />
         </layout>
       </appender>
     </log4net>
   </configuration>

我還有一個類庫,這是它的 App.config 文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <configSections>
   <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
 </configSections>
 <log4net>
   <root>
     <level value="DEBUG" />
     <appender-ref ref="LogFileAppender" />
   </root>
   <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
     <param name="File" value="log.txt" />
     <param name="AppendToFile" value="true" />
     <rollingStyle value="Size" />
     <maxSizeRollBackups value="10" />
     <maximumFileSize value="30MB" />
     <staticLogFileName value="true" />
     <layout type="log4net.Layout.PatternLayout">
       <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />
     </layout>
   </appender>
 </log4net>
</configuration>

這就是我在每個類上呼叫 log 函式的方式:

private static readonly ILog log = LogManager.GetLogger(typeof(AppDomain));

…這就是我所說的:

log.Error("\n\t=>" + ex.GetBaseException().Message + "\n\r" + " @ " + Environment.StackTrace);

可能是您沒有寫入文件“log.txt”的權限。

我不知道目前目錄是什麼,但它不太可能是 IIS 可以寫入的地方。

您需要在某處創建一個文件夾並授予 IIS 對其進行寫入的訪問權限,我知道您需要授予對 IIS_IUSRS 組的訪問權限,然後指定該文件的絕對路徑。例如

<param name="File" value="D:\Logs\log.txt" />

..使用您首選位置的路徑。

在編寫日誌文件時,我傾向於不嘗試將日誌文件寫入程序文件目錄中的任何位置或任何虛擬目錄中的任何內容,這僅僅是因為我之前遇到過安全問題。目前,我對所有 log4net 日誌文件都使用如下內容:

<file type="log4net.Util.PatternString" value="${ALLUSERSPROFILE}/<Product Name>/Logs/<Program Name>/<Program Name>.log" />

${ALLUSERSPROFILE}是上面的關鍵。該目錄通常沒有虛擬目錄和程序文件目錄的安全限制。我發現自從我使用這條路徑以來我沒有遇到任何問題。

此環境變數將您帶到ProgramDataWindows Vista、7、8、Server 2008 等中的目錄。我認為 XP 將您帶到不同的地方,但仍然是一個權限較寬鬆的目錄。

在旁注您上面的日誌語句:

log.Error("\n\t=>" + ex.GetBaseException().Message + "\n\r" + " @ " + Environment.StackTrace);

可以縮短為:log.Error(ex);除非格式化是必須的。但是,如果您這樣編寫並使用 pdbs 部署二進製文件,那麼您記錄的異常將包含完整的堆棧跟踪和發生錯誤的行號。

編輯:

如果您的 log4net 配置無效,日誌文件也將無法創建。如果您確定您對 log4net 配置中指定的文件夾具有寫入權限,我建議debug="true"您通過首先在 log4net 配置部分中設置來啟用 log4net 調試:

<log4net debug="true">
   ...
</log4net>

設置上述調試標誌將告訴 log4net 通過 Windows 跟踪偵聽器輸出它的所有日誌記錄。要擷取此跟踪偵聽器輸出,您必須在 app.config 中添加如下部分:

<system.diagnostics>
 <trace autoflush="true">
   <listeners>
     <add 
       name="textWriterTraceListener" 
       type="System.Diagnostics.TextWriterTraceListener" 
       initializeData="C:\tmp\log4net.txt" />
   </listeners>
 </trace>
</system.diagnostics>

確保 app.config 中上述跟踪偵聽器配置中指定的路徑存在並且您對該文件夾具有寫入權限!

引用自:https://stackoverflow.com/questions/14622897