2017-05-28 18 views
8

Tôi đang sử dụng nhà cung cấp đăng nhập được tích hợp để đăng nhập vào bảng điều khiển (Microsoft.Extensions.Logging.Console) trong ứng dụng giao diện điều khiển .NET Core.Có cách nào để định dạng định dạng đầu ra trong .NET Core logging không?

Mỗi mục nhập nhật ký sẽ tạo hai dòng trong đầu ra. Tôi muốn có mỗi mục trong một dòng. Có cách nào để tùy chỉnh định dạng đầu ra không?

Dưới đây là một ví dụ làm thế nào tôi sử dụng nó:

static void Main(string[] args) 
{ 
    var serviceProvider = new ServiceCollection() 
     .AddLogging() // This adds the Microsoft logging. 
     .AddSingleton<IProjectGeneratorService, CSharpProjectGeneratorService>() 
     .BuildServiceProvider(); 

    // Configure the console logging. 
    serviceProvider 
     .GetService<ILoggerFactory>() 
     .AddConsole(LogLevel.Debug); 

    // Write a logging entry 
    var logger = serviceProvider.GetService<ILoggerFactory>().CreateLogger<Program>(); 
    logger.LogDebug("Application started..."); 
} 

Những gì tôi nhận được là:

dbug: Generator.Program[0] 
     Application started... 

Những gì tôi muốn làm là một cái gì đó như thế này:

dbug: Generator.Program[0]: Application started... 

Bất kỳ ý tưởng? Tôi biết, tôi có thể viết một logger tùy chỉnh, nhưng tôi muốn biết nếu có một cách khác.

Cảm ơn.

+0

Cuối cùng tôi cải thiện Microsoft logger và xuất bản https://github.com/ilya-chumakov/LoggingAdvanced. Sử dụng gói đó, bạn có thể xóa ngắt dòng giữa các phần tin nhắn. Hơn nữa, tôi đã thêm một tính năng sát thủ khác - dấu thời gian! –

Trả lời

4

Hiện tại, điều này không thể định cấu hình. Mã nguồn is here on GitHub:

logBuilder.Append(logName); 
logBuilder.Append("["); 
logBuilder.Append(eventId); 
logBuilder.AppendLine("]"); 

Nếu bạn muốn điều đó, bạn cần phải viết logger của riêng bạn. Tuy nhiên, bạn chỉ có thể sao chép mã nguồn của bộ ghi bàn điều khiển, sửa đổi khi cần và thay đổi các không gian tên để nó không can thiệp vào phiên bản Microsoft phát hành.

Bạn cũng có thể mở issue on the logging repo để yêu cầu tùy chọn này.

+0

Ok, tôi nghĩ đó sẽ là cách duy nhất. Cảm ơn các liên kết và đoạn mã. Điều này đã giúp tôi tiết kiệm thời gian khi tự tìm kiếm :-) – BooFar

2

Vì @MartinUllrich đã đề cập đến ngắt dòng này không thể bị tắt và bạn phải triển khai trình ghi nhật ký tùy chỉnh để tránh nó.

đăng ký:

loggerFactory.AddProvider(new CustomLoggerProvider()); 

thực hiện (có thể được mở rộng với việc sử dụng của mã ConsoleLogger nguồn gốc - ví dụ, bạn có thể thêm GetLogLevelConsoleColors phương pháp):

public class CustomLoggerProvider : ILoggerProvider 
{ 
    public void Dispose() { } 

    public ILogger CreateLogger(string categoryName) 
    { 
     return new CustomConsoleLogger(categoryName); 
    } 

    public class CustomConsoleLogger : ILogger 
    { 
     private readonly string _categoryName; 

     public CustomConsoleLogger(string categoryName) 
     { 
      _categoryName = categoryName; 
     } 

     public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) 
     { 
      if (!IsEnabled(logLevel)) 
      { 
       return; 
      } 

      Console.WriteLine($"{logLevel}: {_categoryName}[{eventId.Id}]: {formatter(state, exception)}"); 
     } 

     public bool IsEnabled(LogLevel logLevel) 
     { 
      return true; 
     } 

     public IDisposable BeginScope<TState>(TState state) 
     { 
      return null; 
     } 
    } 
} 
+0

Xin chào Ilya, cảm ơn rất nhiều về ví dụ này. – BooFar

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