我正在尝试使用Topshelf和Serilog(分别为Serilog.Extras.Topshelf包)为我的Windows服务设置简单的日志配置.
HostLogger.UseLogger(new SerilogHostLoggerConfigurator(new LoggerConfiguration()
.WriteTo.RollingFile(AppDomain.CurrentDomain.BaseDirectory + "\\logs\\app-{Date}.log")
.WriteTo.ColoredConsole()
.MinimumLevel.Debug()
.CreateLogger()));
HostFactory.Run(x => {
x.UseSerilog();
...
Run Code Online (Sandbox Code Playgroud)
该服务运行正常,但没有输出,也没有输出到控制台或指定的日志文件(我可以看到正在创建一个但它仍然是空的).有没有人使用这两个框架?
我试图在ASP.NET核心应用程序(.NET框架)中实现SeriLog
以下是我目前执行的步骤 -
1)在Project.json中添加了以下引用
"Serilog": "2.2.0",
"Serilog.Extensions.Logging": "1.2.0",
"Serilog.Sinks.RollingFile": "2.0.0",
"Serilog.Sinks.File": "3.0.0"
Run Code Online (Sandbox Code Playgroud)
2)在Startup类的构造函数中添加以下行 -
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.RollingFile(Path.Combine(env.ContentRootPath, "log-{Date}.txt"))
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)
3)在Startup类的configure方法中添加以下行 -
loggerFactory.AddSerilog();
Run Code Online (Sandbox Code Playgroud)
4)将记录器注入HomeController,如下所示 -
ILogger logger;
public HomeController(ILogger logger)
{
this.logger = logger;
}
Run Code Online (Sandbox Code Playgroud)
5)在About操作中,尝试记录此类异常 -
public IActionResult About()
{
ViewData["Message"] = "Your application description page.";
try
{
throw new Exception("Serilog Testing");
}
catch (System.Exception ex)
{
this.logger.Error(ex.Message);
}
return View();
}
Run Code Online (Sandbox Code Playgroud)
在运行我的应用程序时,我收到以下错误 -
System.InvalidOperationException:尝试激活'AspNetCore_SeriLog_trial1.Controllers.HomeController'时,无法解析类型'Serilog.ILogger'的服务.在Microsoft.AspNetCore.Mvc.Internal.TypeActivatorCache.CreateInstance
[TInstance]的lambda_method(Closure,IServiceProvider,Object [])上的Microsoft.Extensions.Internal.ActivatorUtilities.GetService(IServiceProvider sp,Type type,Type requiredBy,Boolean isDefaultParameterRequired)IServiceProvider serviceProvider,Type implementationType),位于Microsoft.AspNetCore.Mvc.Inv.Inter.ControllerActionInvoker.d__26的Microsoft.AspNetCore.Mvc.Controllers.DefaultControllerFactory.CreateController(ControllerContext context)中的Microsoft.AspNetCore.Mvc.Controllers.DefaultControllerActivator.Create(ControllerContext controllerContext). .MoveNext()
有人可以帮我这个吗?Serilog缺少任何配置?
所以我有一个 .Net Core 控制台应用程序和一堆 .Net core 库。
库中的大多数类都有这样的构造函数。
public class ReportingManager
{
private ILogger _logger;
Public ReportingManager(ILogger logger)
{
_logger = logger;
}
}
Run Code Online (Sandbox Code Playgroud)
具有ILogger类型Microsoft.Extentions.Logging.ILogger
在我的控制台应用程序中我有这个。
class Program
{
static void Main(string[] args)
{
var serilog = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Warning)
.Enrich.FromLogContext()
.WriteTo.Console(theme: AnsiConsoleTheme.Code)
.CreateLogger();
ReportingManager manager = new ReportingManager(serilog);
}
}
Run Code Online (Sandbox Code Playgroud)
我在“ReportingManager manager = new ReportingManager(serilog);”处出现智能感知错误
无法从“Serilog.Core.Logger”转换为“Microsoft.Extensions.Logging.ILogger”
所以我的问题是,如何正确传入 Serilog?
在线和此处查看过,但大多数讨论的是 ASP.Net Core。
我正在尝试在 .Net Core 项目中使用 Serilog。我有 2 个服务,第一个服务是从 .Net Core 2.2 升级的,在 Program.cs 中它使用 IWebHostBuilder 来启动应用程序。在这里,我创建了记录器并将其作为参数传递给 UseSerilog() ,一切都按预期工作。
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureServices(services => services.AddAutofac())
.UseStartup<Startup>()
.UseSerilog(_logger);
Run Code Online (Sandbox Code Playgroud)
我的第二个服务是使用 .Net Core 3 模板创建的,它使用 IHostBuilder。当我尝试通过以下任一方式使用 Serilog 时,我会收到相同的错误。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>()
.UseSerilog(_logger);
});
Run Code Online (Sandbox Code Playgroud)
或者
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseSerilog(_logger);
Run Code Online (Sandbox Code Playgroud)
给我这个错误
System.InvalidOperationException:尝试激活“MyService.Startup”时无法解析类型“Microsoft.Extensions.Logging.ILogger`1[MyService.Startup]”的服务。
我是Serilog的新手,我很难弄清楚如何使用上下文功能.当我运行下面的代码时,输出文件不包含报告ID.我缺少什么想法?
var logger = new LoggerConfiguration()
.WriteTo
.File(@"C:\Log.txt")
.CreateLogger()
.ForContext("Report ID", 10);
logger.Information("Test");
Run Code Online (Sandbox Code Playgroud) 在RollingFile.outputTemplate我使用我在水槽<appSettings>配置如下:
<add key="serilog:write-to:RollingFile.outputTemplate" value="{Timestamp:HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}" />
Run Code Online (Sandbox Code Playgroud)
我得到的输出日志为:
19:55:10 [Information] Application_Start...
但是,我还要输出生成日志的类名(源),如 -
19:55:10 [Information] [Global.asax.cs] Application_Start...
我应该添加什么"价值"?我添加了[Source]但是没有用.
value ="{Timestamp:HH:mm:ss} [{Level}] [Source?] {Message} {NewLine} {Exception}"
我正在尝试将Serilog与我的ASP.Net Core 1.0项目一起使用.我似乎无法将当前登录的用户添加到已记录的属性中.
有没有人想出来呢?
我试过这个:
using System.Threading.Tasks;
using Serilog.Context;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using System.Security.Claims;
using xxx.Models;
namespace xxx.Utils
{
public class EnrichSerilogContextMiddleware
{
private readonly RequestDelegate _next;
public EnrichSerilogContextMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext httpContext)
{
var username = httpContext.User.Identity.Name;
if (httpContext.User.Identity.IsAuthenticated)
{
var userFullName = (((ClaimsIdentity)httpContext.User.Identity).FindFirst(Member.FullnameClaimName).Value);
var userName = "anyone@gmail.com";
LoggerEnricher.AddEntryPointContext(userFullName, userName);
}
else
{
LoggerEnricher.AddEntryPointContext();
}
await _next(httpContext);
}
}
public static class LoggerEnricher
{
public static void AddEntryPointContext(string userFullName = null, …Run Code Online (Sandbox Code Playgroud) 我为Asp.Net Core 2.0配置了Serilog,它在我的启动Web项目中通过.Net Core依赖注入工作得很好(如果我通过Microsoft.Extensions.Logging使用它),但我无法从任何其他项目访问它.
这就是我所拥有的:
Program.cs中
using System;
using System.IO;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Serilog;
namespace ObApp.Web.Mvc
{
public class Program
{
public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
.Build();
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration)
.CreateLogger();
try
{
Log.Warning("Starting BuildWebHost");
BuildWebHost(args).Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}
}
public …Run Code Online (Sandbox Code Playgroud) 我正在尝试将OpenTracing.Contrib.NetCore与Serilog 一起使用。我需要将自定义日志发送给Jaeger。现在,它仅在我使用默认记录器工厂时才有效Microsoft.Extensions.Logging.ILoggerFactory
我的创业公司:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSingleton<ITracer>(sp =>
{
var loggerFactory = sp.GetRequiredService<ILoggerFactory>();
string serviceName = sp.GetRequiredService<IHostingEnvironment>().ApplicationName;
var samplerConfiguration = new Configuration.SamplerConfiguration(loggerFactory)
.WithType(ConstSampler.Type)
.WithParam(1);
var senderConfiguration = new Configuration.SenderConfiguration(loggerFactory)
.WithAgentHost("localhost")
.WithAgentPort(6831);
var reporterConfiguration = new Configuration.ReporterConfiguration(loggerFactory)
.WithLogSpans(true)
.WithSender(senderConfiguration);
var tracer = (Tracer)new Configuration(serviceName, loggerFactory)
.WithSampler(samplerConfiguration)
.WithReporter(reporterConfiguration)
.GetTracer();
//GlobalTracer.Register(tracer);
return tracer;
});
services.AddOpenTracing();
}
Run Code Online (Sandbox Code Playgroud)
在控制器中的某个位置:
[Route("api/[controller]")]
public class ValuesController : ControllerBase
{
private readonly ILogger<ValuesController> _logger;
public ValuesController(ILogger<ValuesController> logger)
{
_logger = logger;
}
[HttpGet("{id}")] …Run Code Online (Sandbox Code Playgroud) 我正在将ASP.NET Core Web服务器作为Windows服务运行,并且正在使用Serilog记录到%PROGRAMDATA%中的文件。当我将服务作为本地系统运行时,没有任何记录。
我正在Windows 10上使用.Net Core 2.2。我正在通过触发服务中的错误来进行测试,该错误会在错误级别写入日志事件。我已经尝试过以自己的管理帐户运行该服务,并且日志记录工作正常;仅当以本地系统运行时,才会出现此问题。
我还有其他使用.Net Framework的Windows服务,它们作为本地系统运行,并且使用Serilog登录到%PROGRAMDATA%没有问题,但这是我第一次在.Net Core上尝试过。我可以使用Directory.CreateDirectory和File.AppendText在服务内手动创建和写入日志文件,并且在作为本地系统运行时可以运行,但是Serilog日志记录则不能。
这是我的Program.Main:
public static async Task Main(string[] args)
{
var isService = !(Debugger.IsAttached || args.Contains("--console"));
if (isService)
{
var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
var pathToContentRoot = Path.GetDirectoryName(pathToExe);
Directory.SetCurrentDirectory(pathToContentRoot);
}
var host = WebHost.CreateDefaultBuilder(args.Where(arg => arg != "--console").ToArray())
.UseStartup<Startup>()
.UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration)
.Enrich.FromLogContext())
.Build();
// additional async initialization omitted
if (isService)
{
host.RunAsService();
}
else
{
host.Run();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的appsettings.json的Serilog部分:
"Serilog": {
"MinimumLevel": {
"Default": "Verbose",
"Override": {
"Microsoft": "Warning",
"System": …Run Code Online (Sandbox Code Playgroud) serilog ×10
c# ×5
asp.net-core ×4
logging ×3
.net-core ×2
.net ×1
asp.net ×1
jaeger ×1
opentracing ×1
topshelf ×1