2013-08-21 33 views
8

Trong ứng dụng C# của chúng tôi, chúng tôi ghi tệp vào Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments). logfile log4net của chúng tôi nên đến đó quá, vì vậy chúng tôi đã xác định application.conf như sau:Đầu ra của Log4net vào Tài liệu của tôi

<appender name="LogFile" type="log4net.Appender.RollingFileAppender"> 
    <appendToFile value="true"/> 
    <file value="%USERPROFILE%\My Documents\MyApp\log.txt"/> 
    ...snip... 
</appender> 

này hoạt động, cho đến khi chúng tôi chạy ở trên một máy tính trong đó có một không phải tiếng Anh của Windows. Bởi vì sau đó, SpecialFolder.MyDocuments trỏ đến thư mục Mijn Documenten, trong khi nhật ký vẫn chuyển đến My Documents. Lẫn lộn xảy ra sau đó, bởi vì bây giờ các tập tin của chúng tôi ở hai nơi.

Tôi muốn ghi nhật ký của mình vào thư mục "Tài liệu của tôi" thực. Làm thế nào để tôi làm điều này?

  • Tôi đã cố gắng tìm một biến môi trường như %USERPROFILE%, nhưng dường như không tồn tại một đối với Tài liệu của tôi.
  • Có khóa đăng ký xác định vị trí thực sự của Tài liệu của tôi nhưng không thể truy cập từ application.conf.
  • Tôi cố gắng để ghi đè lên File tham số của appender tôi lập trình, như thế này:

    public static void ConfigureLogger() 
    { 
        XmlConfigurator.Configure(); 
    
        Hierarchy hierarchy = (Hierarchy)log4net.LogManager.GetRepository(); 
        foreach (var appender in hierarchy.Root.Appenders) 
        { 
         if (appender is FileAppender) 
         { 
          var fileAppender = appender as FileAppender; 
          var logDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "MyApp"); 
          var pathElements = fileAppender.File.Split(Path.DirectorySeparatorChar); 
          var logFileName = pathElements.Last(); 
          var fullLogFilePath = Path.Combine(logDirectory, logFileName); 
          fileAppender.File = fullLogFilePath; 
         } 
        } 
    } 
    

    này không làm việc một trong hai: khi tôi kiểm tra bên trong của logger của tôi, File sở hữu hạnh phúc báo cáo Mijn Documenten, nhưng trong khi đó các bản ghi vẫn được chuyển đến My Documents.

Tôi sắp hết ý tưởng!

Trả lời

9

Thay đổi dòng

<file value="%USERPROFILE%\My Documents\MyApp\log.txt"/> 

để

<file type="log4net.Util.PatternString" value="%envFolderPath{MyDocuments}\MyApp\log.txt" /> 
1

Dường như có ít nhất 2 phương pháp tiếp cận. Cách đơn giản nhất là loại một hack:

  1. Chỉ định một biến môi trường tùy chỉnh để chỉ ra đường dẫn gốc trong bạn log4net config:

    <file value="%MYAPP_USER_ROOTFOLDER%\MyApp\log.txt"/>

  2. Khi khởi động, trước khi khởi đăng nhập, thiết lập môi trường này giá trị biến:

    Environment.SetEnvironmentVariable("MYAPP_USER_ROOTFOLDER", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));

.210

Cách tiếp cận phức tạp hơn nhưng đề nghị được giải thích ở đây: http://marc.info/?l=log4net-user&m=110142086820117&w=2 và đây http://ziqbalbh.com/articles/log4net-another-way-to-change-log-file-location-on-runtime/

0

Câu trả lời được chấp nhận là hết hiệu lực.

Bây giờ bạn nên sử dụng:

<file value="${UserProfile}\Documents\log-messages.log" /> 

(Điều này sẽ làm việc ngay cả trên Windows 7, trong đó "Tài liệu" được gọi bằng bí danh "My Documents".)

${UserProfile} sẽ ánh xạ tới C: \ Users [UserName], ngay cả khi bạn không thấy biến này được xác định rõ ràng trong danh sách biến môi trường của bạn.

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