Log4net sẽ tạo tệp nhật ký này ở đâu?


77

Khi tôi đặt giá trị tệp thành logs\log-file.txt, chính xác thì nó sẽ tạo thư mục này ở đâu? Trong /bindanh bạ?

Web.config của tôi trông như thế này:

<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>

Đây có phải là cách chính xác để đăng nhập:

ILog logger = LogManager.GetLogger(typeof(CCController));
logger.Error("Some Page", ex);  // where ex is the exception instance

Câu trả lời:


67

Nếu bạn muốn tệp nhật ký của mình được đặt tại một vị trí cụ thể sẽ được quyết định tại thời điểm chạy có thể là thư mục đầu ra dự án của bạn thì bạn có thể định cấu hình .configmục nhập tệp của mình theo cách đó

<file type="log4net.Util.PatternString" value="%property{LogFileName}.txt" />

và sau đó trong mã trước khi gọi log4net configure, hãy đặt đường dẫn mới như bên dưới

 log4net.GlobalContext.Properties["LogFileName"] = @"E:\\file1"; //log file path
 log4net.Config.XmlConfigurator.Configure();

Nó đơn giản như thế nào? :)


2
Lớn lừa, nó giúp đưa tất cả các cấu hình ở một nơi :)
Hoàng Long

1
Điều gì xảy ra nếu bạn muốn nhiều tệp nhật ký trong một chương trình, mỗi tệp trong một đường dẫn khác nhau được xác định tại thời điểm chạy? Có cách nào để đặt thuộc tính LogFileName không trong một số ngữ cảnh dùng chung toàn cầu không?
Jimmy

Có những mẫu khác, chẳng hạn như% date {}, có thể được sử dụng khi bạn áp dụng loại log4net.Util.PatternString: logging.apache.org/log4net/log4net-1.2.11/release/sdk/…
Justin

54

nó sẽ tạo tệp trong thư mục gốc của dự án / giải pháp của bạn.

Bạn có thể chỉ định một vị trí lựa chọn trong web.config của ứng dụng của mình như sau:

   <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>

thẻ tệp chỉ định vị trí.


18
+1 câu trả lời duy nhất trực tiếp trả lời câu hỏi "Log4net sẽ tạo tệp nhật ký này ở đâu?"
Keith

5
Xin chào Oladipo, đối với tôi, nhật ký xác định đường dẫn không được tạo trong thư mục bin.
Pompair

20

Giá trị tệp có thể là một đường dẫn tuyệt đối như "c: \ logs \ log.txt" hoặc một đường dẫn tương đối mà tôi tin là có liên quan đến thư mục bin.

Về việc triển khai nó, tôi thường đặt phần sau ở đầu bất kỳ lớp nào mà tôi định đăng nhập:

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

Cuối cùng, bạn có thể sử dụng nó như sau:

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

5
hmm..có vẻ như không tạo được tệp nhật ký ở đâu và tôi không gặp bất kỳ lỗi nào?
Blankman

2
Có vẻ như vấn đề về quyền. Tôi sẽ ánh xạ cấu hình đến một đường dẫn tuyệt đối bên ngoài thư mục web của bạn. Sau đó, hãy đảm bảo rằng tệp nhật ký và thư mục có quyền cho phép công nhân asp.net xử lý quyền truy cập thích hợp.
Ben.Vineyard

Đối với một con đường tôi tương đối như các tập tin đăng nhập để được ở cấp độ dự án: <file value = "../../log.text" />
Dave Mateer

@Blankman Tôi đã gặp sự cố tương tự. Vấn đề không phải là đường dẫn hay quyền mà là tôi đã quên gọi cấu hình để bắt đầu ghi nhật ký. Vui lòng xem câu trả lời cho câu hỏi tràn ngăn xếp khác. stackoverflow.com/questions/20512548/…
Ngủ trưa

10

Log4net đang lưu vào thư mục dự án của bạn. Cái gì đó như:\SolutionFolder\ProjectFolder\bin\SolutionConfiguration\logs\log-file.txt .

Ở đâu:

  • SolutionFolder là nơi bạn lưu giải pháp của mình
  • ProjectFolder là thư mục nơi dự án của bạn nằm trong giải pháp và
  • SolutionConfiguration là thư mục chứa tất cả các tệp nhị phân của dự án của bạn (mặc định là Gỡ lỗi hoặc Bản phát hành)

Hi vọng điêu nay co ich!


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
Kho lưu trữ ILoggerRepository = log4net.LogManager.GetAllRepositories (). FirstOrDefault ();
Louis Somers

2
Kho đã ở đây: yourlogger.Logger.Repository. Vì vậy, bạn có thể làm điều này: yourlogger.Info($"Logfile opened: {m_Logger.Logger.Repository.GetAppenders().OfType<FileAppender>().FirstOrDefault()?.File}");. Lưu ý rằng nó sẽ không bị vỡ nếu có thứ gì đó null.
Nicolas

4

Đối với thư mục nhật ký và nội dung tệp, hãy đi với câu trả lời @Bens .

Tuy nhiên, tôi sẽ bình luận về phần tạo nhật ký. Imo không có cách nào chính xác . Khi mã hóa trình ghi nhật ký theo cách thủ công, tôi làm theo cách bạn đang làm:

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

bởi vì nó ngắn gọn và súc tích.

Điều đó nói rằng, những ngày này tôi không tạo các phiên bản ghi nhật ký bên trong các lớp, tôi để vùng chứa IoC của mình chèn nó cho tôi .


0

Tôi nghĩ rằng mẫu của bạn đang được lưu vào các thư mục dự án của bạn và trừ khi iis mặc định hoặc .NET, người dùng có quyền tạo thì sẽ không thể tạo thư mục nhật ký.

Trước tiên, tôi sẽ tạo thư mục nhật ký và cho phép người dùng có toàn quyền và xem liệu tệp nhật ký có đang được tạo hay không.


0

nếu bạn muốn chọn động đường dẫn đến tệp nhật ký, hãy sử dụng phương thức được viết trong liên kết này: phương thức động chọn đường dẫn tệp nhật ký .

nếu muốn, bạn có thể đặt đường dẫn đến nơi tệp EXE ứng dụng của bạn tồn tại như thế này -

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

và sau đó gửi 'logFileLocation' này đến phương thức được viết trong liên kết ở trên như thế này:

Initialize(logFileLocation);

và bạn đã sẵn sàng để đi! :)


0

Tôi đang phát triển cho .NET core 2.1 bằng log4net 2.0.8 và thấy mã NealWalters rên rỉ về 0 đối số cho XmlConfigurator.Configure (). Tôi đã tìm thấy giải pháp của Matt Watson ở đây

        log4net.GlobalContext.Properties["LogFileName"] = @"E:\\file1"; //log file path
        var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
        XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.