2011-11-07 44 views
20

Trong công ty của tôi, chúng tôi đang làm việc với NLog. Chúng tôi đang gặp sự cố với số lượng lớn tệp nhật ký. Những gì chúng tôi muốn làm là lưu trữ các tập tin theo ngày và giữ tối đa một số lượng x tập tin. Cho phép nói 7. Tôi đã đọc một số chủ đề trên internet liên quan đến điều này và họ chủ yếu chỉ cho tôi trong cùng một hướng sửa đổi tập tin NLog.config của tôi. Tuy nhiên nó dường như không sẵn sàng để xoay các tập tin như tôi mong đợi nó để làm. Hiện tại không có gì đang được lưu trữ trong thư mục mong muốn. Nhưng tất cả các tệp được lưu trong thư mục 'logs'-' ở định dạng sau;Nhật ký xoay vòng và dọn dẹp NLog

Log.info.2011-11-07.txt 

Trong ứng dụng của tôi, tôi đã có một thư mục 'nhật ký'. Bên trong thư mục đó tất cả các logfiles được lưu lại. Tôi cũng có một thư mục được gọi là 'lưu trữ', trong đó tôi muốn lưu trữ tất cả các tệp cũ hơn. Sau khi đạt được số lượng tệp nhật ký tối đa trong thư mục đó, chúng sẽ tự động được làm sạch. Điều này có thể không? Tệp NLog.config hiện tại của tôi trông giống như dưới đây;

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     autoReload="true" 
     throwExceptions="true" 
     internalLogFile="C:\nlog-internal.txt" 
     internalLogLevel="Error"> 

    <extensions> 
    <add assembly="NLog.Extended" /> 
    </extensions> 

    <targets> 
    <!-- will move file to archive once it reaches 1MB. Files are archived by day, with a maximum of three files. ConcurrentWrites is set to false, 
      change to true if multiple processes will be writing to the logfile--> 
    <target name="file" xsi:type="File" fileName="${basedir}/logs/Log.info.${shortdate}.txt" 
      layout="${longdate} ${callsite} ${level}: ${message} ${exception:format=Message,StackTrace} ${stacktrace}" 
      archiveFileName="${basedir}/logs/archives/log.info.${shortdate}.txt" 
      archiveAboveSize="1048576" 
      archiveEvery="Day" 
      archiveNumbering = "Rolling" 
      maxArchiveFiles="7" 
      concurrentWrites="false" 
      /> 
    <target name="file-default" xsi:type="File" fileName="${basedir}/log_default.txt"/> 
    <target name="file-debug" xsi:type="File" fileName="${basedir}/log_debug.txt"/> 
    <target name="file-testclass" xsi:type="File" fileName="${basedir}/log_testclass.txt"/> 
    <target name="mail" xsi:type="Mail" 
      subject="${level} - ${aspnet-request:serverVariabele=PATH_INFO} | ${callsite:includeSourcePath=true}" 
      to="[email protected]" 
      smtpServer="mail.server.com" 
      from="[email protected]"/> 
    <target xsi:type="Database" 
      name="TestDatabaseLogging" 
      connectionString="Data Source=123.123.123.123;Initial Catalog=NLog_Test;User ID=su_Nlog;Password=test123" 
      dbDatabase="NLog_Test"> 
     <commandText> 
     insert into INNO_LOG ([createDate], [Origin], [LogLevel], [Message], [Exception], [StackTrace]) values (@createDate, @origin, @logLevel, @message, @exception, @stackTrace) 
     </commandText> 
     <parameter name="@createDate" layout="${date}"/> 
     <parameter name="@origin" layout="${callsite}"/> 
     <parameter name="@logLevel" layout="${level}"/> 
     <parameter name="@message" layout="${message}"/> 
     <parameter name="@exception" layout="${exception:format=Message,StackTrace}"/> 
     <parameter name="@stackTrace" layout="${stacktrace}"/> 
    </target> 

    </targets> 

    <rules> 
    <logger name="*" minlevel="Fatal" writeTo="mail" /> 
    <logger name="*" minlevel="Error" writeTo="TestDatabaseLogging" /> 
    <logger name="*" minlevel="Debug" writeTo="file-debug" /> 
    <logger name="*" minlevel="Info" writeTo="file" /> 
    <!--Log to specific files for specific classes.--> 
    <logger name="_Default" minlevel="Trace" writeTo="file-default" /> 
    <logger name="TestClass" minlevel="Trace" writeTo="file-testclass" /> 
    </rules> 
</nlog> 

EDIT: Trận chung kết (snipped) giải pháp sau ckellers trả lời.

<target name="file" 
      xsi:type="File" 
      fileName="${basedir}/logs/Log.${level}.current.txt" 
      layout="${longdate} ${callsite} ${level}: ${message} ${exception:format=Message,StackTrace} ${stacktrace}" 
      archiveFileName="${basedir}/logs/archives/log.error.${shortdate}.{#}.txt" 
      archiveAboveSize="5242880" 
      archiveEvery="Day" 
      archiveNumbering = "Rolling" 
      maxArchiveFiles="3" /> 

Trả lời

15

Có vẻ như vấn đề là shortdate trong định nghĩa tên tệp của bạn. Xem câu trả lời của tôi ở câu hỏi này: Delete log files after x days

Bạn phải xác định tên tập tin mà không có phần ngày

fileName="${basedir}/logs/Log.info.txt 
+0

Điều đó đã làm nó! Tôi đã tìm thấy chủ đề này thông qua Google trước đó, nhưng không bao giờ nghĩ rằng shortdate trong tên sẽ gây ra vấn đề. Tôi đã thêm {#} sau ngày rút gọn và nó đã hoạt động! – Rob

+0

@Rob cảm ơn cho mẹo với '{#}'! Tôi không biết điều đó. – ccellar

+0

bạn được chào đón :) – Rob

Các vấn đề liên quan