2011-09-13 30 views
5

Tôi đang thực hiện đăng nhập vào ứng dụng của mình qua NLog. Tôi đang cố gắng thu thập một số nhật ký để chẩn đoán một vấn đề kỳ lạ mà tôi chỉ có trên một máy. Trong NLog.Config của tôi, tôi có cấu hình như sau:NLog dường như không đăng nhập vào môi trường ClickOnce nhưng hoạt động trong dev

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

    <targets> 
    <target name="logfile" xsi:type="File" fileName="${specialfolder:dir=PollingLogs:file=log.txt:folder=MyDocuments}" /> 
    </targets> 

    <rules> 
    <logger name="*" minlevel="Debug" writeTo="logfile" /> 
    </rules> 
</nlog> 

Khi tôi chạy trên máy phát triển của tôi Tôi nhận được một tập tin log.txt tạo ra trong thư mục tài liệu của tôi, với tất cả khai thác gỗ xảy ra một cách chính xác. Tuy nhiên, khi tôi triển khai ứng dụng với ClickOnce, không có tệp log.txt nào được tạo (mà tôi có thể tìm thấy ít nhất). Không có lỗi nào xảy ra và ứng dụng của tôi chạy như bình thường, nhưng không có gì xảy ra.

Tôi đang bối rối về cách thậm chí gỡ lỗi vấn đề này. Có ai có bất kỳ cái nhìn sâu sắc họ có thể chia sẻ để giúp tôi nhận được NLog để làm việc một cách chính xác trong một môi trường clickonce?

Để tham khảo, tham chiếu NLog trong dự án của tôi được đặt thành sao chép cục bộ.

+0

Tôi luôn ghi vào nhật ký khi ứng dụng bắt đầu và làm cho nó không thành công nếu đăng nhập thất bại. Bằng cách này, tôi biết khi nào tôi triển khai ứng dụng - cho dù web hay máy tính để bàn - nhật ký đó đang hoạt động và sẽ ở đó khi tôi cần. – DOK

+0

Làm thế nào để bạn phát hiện xem NLog có thành công hay không? – KallDrexx

+0

Bạn có thể thử thêm [internalLogFile = "nlog-errors.log"] (http://nlog-project.org/wiki/Internal_logging) vào tệp cấu hình nlog và sau đó nếu nlog tự nhận được ngoại lệ khi cố gắng ghi nhật ký sẽ đăng nhập lỗi đăng nhập vào tệp nhật ký đó – BrandonAGr

Trả lời

2

Để gỡ lỗi việc sử dụng này Sysinternal ProcessMon (miễn phí). Nó có thể cho bạn thấy trong số những thứ khác các tập tin các truy cập thử/làm bằng một quá trình ...

Đối với loại Log tôi sẽ khuyên bạn sử dụng ApplicationData hay CommonApplicationData hoặc LocalApplicationData từ Environment.SpecialFolder và không MyDocuments ...

+2

ProcMon sẽ tốt, bạn có thể kiểm tra để đảm bảo ứng dụng đang đọc tệp cấu hình nlog mà bạn mong đợi là tệp đầu tiên. Có thể tệp cấu hình nlog không được triển khai với ứng dụng clickonce? – BrandonAGr

0

Tôi đã gặp phải vấn đề này với một dự án mà tôi đang làm hôm nay.

File NLog.config là nhận được sao chép vào thư mục của bạn xây dựng nên rất hay khi bạn chạy nó từ đó, nhưng những phần cài đặt ClickOnce là không triển khai file NLog.config khi phần mềm được cài đặt.

Điều này giải thích hành vi bạn nhìn thấy: khi chạy từ bản sao đã cài đặt, nó không có bất kỳ cấu hình ghi nhật ký nào.

Giải pháp duy nhất tôi đã tìm thấy cho đến nay là hợp nhất cấu hình ghi nhật ký vào tệp app.config của bạn, vì tệp exe.config không được triển khai bởi ClickOnce - tôi không có nhiều niềm vui khi cố gắng thêm NLog.config đến trình cài đặt.

4

Tôi biết điều này hơi muộn nhưng có một giải pháp khác được mô tả ở đây: Configure log4net or NLog with XML from code mặc dù nó trả lời một câu hỏi khác.

Tôi đã có cùng một vấn đề được mô tả bởi KallDrexx. Tôi không hài lòng với nhiều file cấu hình NLog nổi về (nhiều dự án trong cùng một giải pháp) để tạo ra một lớp NLogHelper trong đó có một phương pháp trả lại cấu hình:

public static XmlLoggingConfiguration SetNlogConfiguration() 
    { 
     var sr = new StringReader(NlogXmlConfigString1()); 
     var xr = XmlReader.Create(sr); 
     var config = new XmlLoggingConfiguration(xr, null); 
     return config; 
    } 

Một phương pháp riêng biệt chỉ trả về chuỗi xml, trong trường hợp của tôi:

private static string NlogXmlConfigString1() 
    { 
     return @"<nlog xmlns='http://www.nlog-project.org/schemas/NLog.xsd\' 
         xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance\'> 
        <targets> 
         <target name='logfile' xsi:type='File' fileName='${specialfolder:file=My_Logger.txt:folder=Desktop}' /> 
        </targets> 

        <rules> 
        <logger name='*' minlevel='Info' writeTo='logfile' /> 
        </rules> 
       </nlog>"; 
    } 

Cuối cùng, tôi chỉ cần thiết lập cấu hình trong lớp constructor có liên quan:

NLog.LogManager.Configuration = NlogHelper.Helper.SetNlogConfiguration(); 

Rõ ràng nó có thể được refactored và các mặt hàng như l Tên tệp og có thể được chuyển thành tham số nếu được yêu cầu. Cấu hình xml chỉ có thể được thay thế bằng bất cứ cấu hình nào của bạn. Cũng dường như cung cấp khả năng xác định dễ dàng nhiều cấu hình được chọn tại thời gian chạy.

Tôi thích nó vì tôi thấy nó cho phép tôi kiểm soát tốt hơn cấu hình NLog trong mã và trong quá trình triển khai.

5

Tôi tìm thấy câu trả lời cho vấn đề này khi NLog.config của bạn sẽ không được sao chép vào chương trình nếu được cài đặt bằng cách sử dụng ClickOnce.

Bạn cần chọn tập tin NLog.config trong bạn Project sử dụng Solution Explorer và thiết lập Properties của nó như sau:

Build Action: Nội dung

Copy to Output mục: Sao chép luôn

Bây giờ khi bạn triển khai sử dụng ClickOnce, các tệp cũng sẽ được sao chép! :)

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