有什么方法可以在 serilog 中为每个文件配置一个日志级别吗?
我知道我可以为每个“MinimumLevel”配置一个文件,但这不是我需要的。
我正在尝试在我的 UWP 应用程序中显示 Serilog“logs.txt”文件的内容。我已成功显示它,但现在我希望它在创建新日志事件时自动刷新。
到目前为止,我尝试创建一个 ContentsChanged 事件侦听器来订阅本地文件驱动器中 .txt 文件中的更改。
private async void CreateFileUpdater()
{
List<string> fileTypeFilter = new List<string>();
fileTypeFilter.Add(".txt");
var options = new Windows.Storage.Search.QueryOptions(Windows.Storage.Search.CommonFileQuery.OrderByName, fileTypeFilter);
var query = ApplicationData.Current.LocalFolder.CreateFileQueryWithOptions(options);
//subscribe on query's ContentsChanged event
query.ContentsChanged += Query_ContentsChanged;
var files = await query.GetFilesAsync();
}
private void Query_ContentsChanged(Windows.Storage.Search.IStorageQueryResultBase sender, object args)
{
ReadFileAsync(); //This updates the bound variable to display in UI
}
Run Code Online (Sandbox Code Playgroud)
但是,当新的日志事件添加到日志文件时,它似乎无法正确触发。所以我想知道 Serilog 本身是否有一个我在文档中没有看到的事件,或者是否有更好的方法来检测文件中的更改或何时将内容添加到文件中。我只想调用某种事件,以便我可以触发 ReadFilesAsync() 函数来更新绑定到我的 UI 的变量。
谢谢你的帮助!
我有一个与 appSettings.json 的 Serilog 配置有关的问题。我的项目是一个控制台应用程序,基于.Net Core 3.0。我尝试设置 Serilog 以便将日志信息写入控制台和日志文件。
当我在代码本身中配置所有内容时 - 一切都按预期工作。
但是,当我尝试从 appsettings.json 文件导入 Serilog 配置设置时,我遇到了问题,我的 ConsoleSink 工作正常,但我的 FileSink 不行。
这是我在 appsettings.json 中写入的内容:
{
"Serilog": {
"Using": [ "Serilog.Sinks.File", "Serilog.Sinks.Console" ],
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "File",
"Args": { "pathFormat": "Xlog.txt" }
},
{ "Name": "Console" }
]
}
}
Run Code Online (Sandbox Code Playgroud)
这是相关的代码:
IConfiguration configSerilog = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", true, true)
.Build();
log = new LoggerConfiguration()
.ReadFrom.Configuration(configSerilog)
.CreateLogger();
log.Information("Initializing Serilog....");
Run Code Online (Sandbox Code Playgroud)
我的“测试日志消息”显示在我的控制台窗口中,但我没有收到日志文件。
正如我所提到的,当我在代码本身中配置 Serilog 时,它就可以工作,而不是通过应用程序设置。因此,我确实拥有创建文件的适当访问权限。
有什么想法或提示吗?
我正在使用最新的Serilog.File 4.1.0和Serilog.Sinks.Async. 异步日志记录有效,但我希望滚动文件。如何启用文件滚动?
我有以下内容:
Log.Logger = new LoggerConfiguration()
.WriteTo.Async(a =>
{
a.File("logs/logs.log");
})
.MinimumLevel.Verbose()
.CreateLogger();
Run Code Online (Sandbox Code Playgroud) 我有一个通过appsettings.json文件配置 Serilog 的应用程序,我在 Windows 上开发该应用程序,但它部署到 Linux 上。如何将日志写入相对目录Logs/logfile.log?
仅更改部署文件夹中的 appsettings.json 是一个不错的选择吗?
现在这是我正在使用的配置:
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File", "Serilog.Sinks.MSSQLServer" ],
"Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId" ],
"MinimumLevel": {
"Default": "Warning",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{
"Name": "Console",
"Args": {
"outputTemplate": "[{Timestamp:HH:mm:ss} {SourceContext} [{Level}] {Message}{NewLine}{Exception}",
"theme": "Serilog.Sinks.SystemConsole.Themes.SystemConsoleTheme::Grayscale, Serilog.Sinks.Console"
}
},
{
"Name": "File",
"Args": {
"path": "Logs\\log-.log",
"rollingInterval": "Day",
"retainedFileCountLimit": 5
}
}
]
},
Run Code Online (Sandbox Code Playgroud) 我正在使用滚动将所有日志写入一个文件。但我想通过Information,Warning和Exceptions滚动文件将它们分开。
我当前的配置是这样的
"Serilog": {
"WriteTo": [
{
"Name": "RollingFile",
"Args": {
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}",
"pathFormat": "logs\\log-{Hour}.log",
"rollOnFileSizeLimit ": true,
"retainedFileCountLimit ": null,
"rollingInterval": "Hour",
"fileSizeLimitBytes": 5000000
}
}
]
},
Run Code Online (Sandbox Code Playgroud)
班级
public ILogger GetLogger()
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
_logger =
new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
return _logger ;
}
Run Code Online (Sandbox Code Playgroud) 以前,当使用时,Microsoft.Extensions.Logging我会注入,ILoggerFactory并且.UseLoggingFactory()在设置我的 DbContext 时,如下所示(为了简洁而减少);
private readonly ILoggerFactory LoggerFactory;
public Startup(... ILoggerFactory loggerFactory)
{
LoggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
}
public void ConfigureServices(IServiceCollection services)
{
var connectionString = Configuration.GetConnectionString($"DbDataContext");
services.AddDbContext<OakfieldLeasingDataContext>(
options => options
.UseSqlServer(
connectionString,
x => x.UseNetTopologySuite())
.UseLoggerFactory(LoggerFactory));
}
Run Code Online (Sandbox Code Playgroud)
我现在正在尝试换入Serilog,我已成功更改Program.cs如下;
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console(new RenderedCompactJsonFormatter())
.WriteTo.File(new RenderedCompactJsonFormatter(), "./logs/log.ndjson")
.CreateLogger();
try
{
Log.Information("Starting up");
CreateHostBuilder(args).Build().Run();
}
catch (Exception ex) …Run Code Online (Sandbox Code Playgroud) 我正在 VS 2019 中开发 WPF .Net 项目,而不是 .Net Core。我想要记录异常。我对此有一些疑问:
我将不胜感激详细的解释和样品。
谢谢
我想了解如何在 PS 中使用 SeriLog。
这是一个有效的代码示例:
$SeriLog = Add-Type -Path "C:\Program Files\PackageManagement\Serilog.2.10.0\lib\net46\Serilog.dll" -PassThru
$SeriLog_Sink_Console = Add-Type -Path "C:\Program Files\PackageManagement\Serilog.Sinks.Console.3.1.1\lib\net45\Serilog.Sinks.Console.dll" -PassThru
$SeriLog_Config = New-Object Serilog.LoggerConfiguration
$SeriLog_Config = [Serilog.Configuration.LoggerSinkConfiguration]$SeriLog_Config_Sink = $SeriLog_Config.WriteTo
[Serilog.Log]::Logger = [Serilog.ConsoleLoggerConfigurationExtensions]::Console($SeriLog_Config_Sink).CreateLogger()
[Serilog.Log]::Information("Logging started")
Run Code Online (Sandbox Code Playgroud)
根据 dotnet SeriLogs 网站上列出的示例,我不明白的是为什么我的所有接收器都丢失了。
例子:
$SeriLog = Add-Type -Path "C:\Program Files\PackageManagement\Serilog.2.10.0\lib\net46\Serilog.dll" -PassThru
$SeriLog_Sink_Console = Add-Type -Path "C:\Program Files\PackageManagement\Serilog.Sinks.Console.3.1.1\lib\net45\Serilog.Sinks.Console.dll" -PassThru
$SeriLog_Config = New-Object Serilog.LoggerConfiguration
$SeriLog_Config.WriteTo.Console()
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
InvalidOperation:方法调用失败,因为 [Serilog.Configuration.LoggerSinkConfiguration] 不包含名为“Console”的方法。
这在某种程度上是有道理的,因为我可以看到它丢失了,但我不明白为什么?我已经导入了两个 DLL。我想对我来说,在理解如何在 PS 中使用 DLL 方面我还是个新手。我的运气要好得多,并且使用 Log4Net 拥有一个可靠工作的模块,但我正在尝试迁移到更现代的东西,并且我正在绞尽脑汁试图了解如何集成各种接收器,如果公共示例dotnet 不翻译为 PS。
JFYI,我正在使用 PS 7.1,以防万一。
现在我们有一个架构,其中应用程序将日志记录到文件,然后 fluidd 拉取日志并将其推送到elasticsearch,因此在这种情况下,我们希望压缩日志以利用空间,serilog 是否支持在写入之前进行日志压缩它到文件??
在另一种情况下,客户可能会记录超过5mb的数据,是否可以将日志写入文件,然后通过fluidd推送到elasticsearch?我觉得它会影响并导致失败,任何想法如何将超过 5mb 或大约 10mb 的消息推送到弹性搜索。
编写的示例代码:
.UseSerilog((hostingContext, loggerConfiguration) =>
{
loggerConfiguration.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.File(path: Path.Combine(Environment.CurrentDirectory, "Logs", "log.txt"),
rollOnFileSizeLimit: true,
retainedFileCountLimit: 20,
rollingInterval: RollingInterval.Day,
fileSizeLimitBytes: 10000
)
.WriteTo.Console();
})
Run Code Online (Sandbox Code Playgroud)