2009-04-15 40 views
9

Khi tôi chạy ứng dụng cục bộ, nó ghi nhật ký log4net của tôi đến vị trí tôi đã định cấu hình (ví dụ: <file value="${LOCALAPPDATA}\TEST\Logs\debug.log" />) mà không có sự cố. Tuy nhiên, khi tôi triển khai ứng dụng của mình qua ClickOnce, tệp nhật ký sẽ không được ghi.Tôi có thể ghi tệp nhật ký log4net của mình vào dưới ClickOnce ở đâu?

Tôi biết các ứng dụng ClickOnce bị giới hạn về nơi họ có thể ghi, nhưng tôi đã có ấn tượng rằng LOCALAPPDATA (ví dụ: C: \ Users \ me \ AppData \ Local) là trò chơi công bằng.

Bất kỳ ý tưởng nào?

Trả lời

15

Với ClickOnce, các quy tắc thư mục là hơi khác so với các ứng dụng Windows thông thường. Thư mục dữ liệu, nơi các tệp nội dung ClickOnce được triển khai, nằm trong c: \ Users \ me \ Local Settings \ Apps \ 2.0 \ Data. Bên dưới thư mục đó là một vài cấp thư mục con với số nhận dạng khá khó hiểu.

Vì vậy, thư mục dữ liệu thực tế cho một ứng dụng ClickOnce nhất định được truy xuất tốt nhất bằng cách sử dụng lớp ApplicationDeployment. Bạn cũng nên kiểm tra tài sản IsNetworkDeployed để xem nếu bạn đang chạy trong chế độ triển khai:

if (ApplicationDeployment.IsNetworkDeployed) 
{ 
    var dataDirectory = ApplicationDeployment.CurrentDeployment.DataDirectory; 
    ... 
} 

Kể từ khi DataDirectory được quyết định bởi ClickOnce không có cách nào bạn có thể hardcode rằng đường dẫn vào cấu hình log4net của bạn. Đề xuất của tôi là sửa đổi đường dẫn tệp chương trình khi khởi động ứng dụng.

foreach(var appender in LogManager.GetRepository().GetAppenders()) 
{ 
    var fileAppender = appender as FileAppender; 
    if (fileAppender != null) 
    { 
     fileAppender.File = 
      fileAppender.File.Replace("${LOCALAPPDATA}", dataDirectory); 
     fileAppender.ActivateOptions(); 
    } 
} 
+1

Nếu điều này không giải quyết được vấn đề của bạn, hãy đảm bảo tệp cấu hình (ví dụ: log4net.config) không được triển khai dưới dạng "Tệp dữ liệu" – Pakman

+1

Tương tự như những gì @Pakman nói, bạn cần đảm bảo Build Action trên thuộc tính tệp log4net.config được đặt thành Content (không phải None) để tệp log4net.config được triển khai và đọc bởi ứng dụng của bạn. http://stackoverflow.com/a/16433824/602585 – deadlydog

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