2010-05-05 6 views
24

Tôi có một ứng dụng bao gồm một mô-đun máy chủ và các trình cắm (plugin).log4net - định cấu hình bằng nhiều tệp cấu hình

Tôi muốn có thể định cấu hình log4net cho máy chủ và cho từng mô-đun khác. Mỗi người trong số họ phải có tệp cấu hình riêng và mỗi tệp sẽ đăng nhập vào một tệp khác.

Chỉ máy chủ lưu trữ có tệp App.config. Các plugin có tập tin cấu hình riêng của họ có chứa các phần cấu hình log4net.

Gọi XmlConfigurator.Cấu hình từ một trong các plugin sẽ ghi đè định nghĩa log4net của ứng dụng của máy chủ.

Có cách nào dễ dàng để nối cấu hình thay vì ghi đè chúng không?

Xin cảm ơn, Gai.

Trả lời

2

Tôi chỉ tự mình gặp sự cố này. Trong khi nó không chính xác những gì tôi muốn gọi là "lý tưởng", tôi nghĩ rằng giải pháp tốt nhất hiện nay là sử dụng phương pháp ConfigureAndWatch của lớp XmlConfigurator. Về cơ bản, bạn có lắp ráp máy chủ của bạn thiết lập cấu hình log4net bằng cách sử dụng một tập tin cấu hình cụ thể. Khi các plugin của bạn tải, hãy để chúng viết các phần tử cấu hình của chúng vào phần cấu hình log4net trong cùng một tệp cấu hình đó. Vì log4net đã được yêu cầu xem tệp đó cho các thay đổi với ConfigureAndWatch, khi tệp có dữ liệu mới được thêm vào, log4net sẽ tải lại cấu hình mà bây giờ sẽ bao gồm các phần tử cấu hình từ (các) plugin.

Đây là một chút hackish, nhưng có vẻ như nó hoạt động. Bước tiếp theo của khóa học sẽ được chuyển vào khung đăng nhập của tôi để truy cập vào tệp cấu hình được liên kết.

Lưu ý rằng có sự chậm trễ ngắn giữa cấu hình của plugin đang được ghi/lưu và cấu hình được cập nhật được tải lại và áp dụng cho kho lưu trữ nhật ký.

+0

Cảm ơn Stuart, tôi sẽ cung cấp cho nó một thử. – Gai

16

Dường như bạn đã tìm thấy giải pháp phù hợp với mình. Tuy nhiên, tôi đã tìm thấy một giải pháp khác mà tôi cho là "lý tưởng hơn", vì vậy tôi sẽ đăng nó ở đây cho bất cứ ai có thể tìm thấy câu hỏi này trong tương lai.

log4net có khái niệm được gọi là kho lưu trữ có thể được định cấu hình riêng. Đó là không phải là rất phổ biến và cũng không rất tốt tài liệu, nhưng đây là một số tài liệu tôi tìm thấy:

http://logging.apache.org/log4net/release/manual/repositories.html

Dù sao, tất cả các bạn cần làm là thêm RepositoryAttribute về lắp ráp plugin hoặc hội đồng của bạn với một tên kho duy nhất để plugin và log4net sẽ giữ nó tách biệt với mọi thứ khác.

4

Tuy nhiên, một cách khác là có nhiều tệp cấu hình log4net ở nhiều nơi, tải tất cả lên trong một XDocument để soạn một cách hiệu quả một tệp duy nhất, sau đó gọi XmlConfigurator.Configure(). Cách tôi đã làm điều này là tạo mỗi tệp theo XSD cho cấu hình, tải tất cả các nút con của mỗi nút gốc log4net của từng tệp vào các trường hợp riêng biệt XElement và hợp nhất chúng thành một XDocument mới với nút gốc log4net. Tôi sẽ cập nhật câu trả lời này với mã (nó không phải ở phía trước của tôi vào lúc này) nếu có ai quan tâm hơn nữa.

Tìm tệp là một vấn đề khác: sử dụng một số loại quy ước để quét tệp (ví dụ: *.dll.log4net.config), nhúng chúng vào các hội đồng hoặc một thứ gì đó.

An thực hiện mã như vậy có thể được tìm thấy trên:

www.kopf.com.br/kaplof/using-multiple-configuration-files-with-log4net

+0

Bạn sẽ làm điều này như thế nào? Âm thanh như một giải pháp tốt. Có vẻ như không tầm thường vì bạn chỉ cần giữ một thẻ "log4net" duy nhất và hợp nhất nội dung của thẻ đó. – Wayne

+0

Tôi đã cập nhật câu trả lời của mình với chi tiết hơn một chút. Hóa ra là không lấy quá nhiều mã, và cũng đáng để có các cài đặt ghi nhật ký khác nhau cho mỗi môi trường mà không cần đến các bước xây dựng bổ sung. – Kit