LINQPAD 加入日志功能

https://github.com/lethek/Serilog.Sinks.LINQPad


async Task Main(string[] args)
{
    // #load "LogLib" , 可以作为库引入

    ExceptionlessClient client = EnableDefaultExceptionless();
    await UpdateExceptionlessConfiguration(client);

    try
    {
        var logName = client.Configuration.Settings.GetString("logFileName", "test_.log"); // 从 exceptionless 读日志文件名

        var app = this.CreateApp(args, $@"./logs/{logName}"); // 创建日志
        var logger = this.GetLogger(app); // 创建日志

        // 返回当前路径
        var direcotry = GetCurrentDirectory();
        logger.LogInformation($@"current dir: {direcotry}");

        throw new NotImplementedException();
    }
    catch (Exception exception)
    {
        // 写异常信息至服务器
        exception.ToExceptionless().Submit();

        throw;
    }
    finally
    {
        // 等待异常信息写入完成
        await client.ProcessQueueAsync();
    }

}

// 返回日志
Microsoft.Extensions.Logging.ILogger GetLogger(Microsoft.Extensions.Hosting.IHost app, string categoryName)
{
    var loggerFactory = app.Services.GetRequiredService<ILoggerFactory>();
    var logger = loggerFactory.CreateLogger(categoryName);

    return logger;
}

// 返回默认日志
Microsoft.Extensions.Logging.ILogger GetLogger(Microsoft.Extensions.Hosting.IHost app)
{
    return this.GetLogger<UserQuery>(app);
}

// 返回日志
Microsoft.Extensions.Logging.ILogger GetLogger<T>(Microsoft.Extensions.Hosting.IHost app)
{
    var logger = app.Services.GetRequiredService<ILogger<T>>();
    return logger;
}

// 返回脚本所在的路径 
string GetCurrentDirectory()
{
    return Path.GetDirectoryName(Util.CurrentQueryPath);
}

// 返回日志的完整路径 
bool GetLogFullPath(string logName, out string fullPath)
{

    fullPath = null;

    if (string.IsNullOrWhiteSpace(logName))
    {
        return false;
    }

    if (System.IO.Path.IsPathRooted(logName))
    {
        fullPath = logName;
        return true;
    }

    fullPath = Path.Combine(this.GetCurrentDirectory(), logName);
    return true;
}

// 更新默认的 exceptionless 设置,使用 ExceptionlessClient.Default
async Task UpdateDefaultExceptionlessConfiguration()
{
    await this.UpdateExceptionlessConfiguration(ExceptionlessClient.Default);
}

// 立即更新一下 exceptionless 设置
async Task UpdateExceptionlessConfiguration(ExceptionlessClient client)
{
    await Exceptionless.Configuration.SettingsManager.UpdateSettingsAsync(client.Configuration);
}

ExceptionlessClient EnableExceptionlessClient(ExceptionlessClient client)
{

    var dict = new Dictionary<string, string>();
    dict["Exceptionless:Enabled"] = "true";
    dict["Exceptionless:ApiKey"] = "xxx";
    dict["Exceptionless:ServerUrl"] = "https://git.gnlab.com:7004";
    // 同步服务端时间,启动后 5 秒,然后间隔 2 分钟
    //ExceptionlessClient.Default.Configuration.UpdateSettingsWhenIdleInterval = TimeSpan.FromSeconds(5);
    //dict["Exceptionless:EnableLogging"] = "true";
    //dict["Exceptionless:StoragePath"] = this.GetCurrentDirectory();
    var configurationRoot = new ConfigurationBuilder().AddInMemoryCollection(dict).Build();

    // 代理
    //client.Configuration.Proxy = new System.Net.WebProxy("127.0.0.1", 8888);
    client.Configuration.ReadFromConfiguration(configurationRoot);

    return client;
}

// 启用我的 exceptionless 服务
ExceptionlessClient EnableDefaultExceptionless()
{
    return this.EnableExceptionlessClient(ExceptionlessClient.Default);
}

// 创建应用
IHost CreateApp(string[] args, string logName = null, Action<HostApplicationBuilder> configBuilder = null)
{
    var outputTemplate = "[{Timestamp:HH:mm:ss} [{ThreadId}] [{SourceContext}] {Level:u3}] {Message}{NewLine}{Exception}";

    var logConfig = new LoggerConfiguration()
    .Enrich.WithThreadId()
    .WriteTo.LINQPad(outputTemplate: outputTemplate);

    if (this.GetLogFullPath(logName, out var fullPath))
    {
        logConfig = logConfig.WriteTo.File(fullPath, rollOnFileSizeLimit: true, rollingInterval: RollingInterval.Day, outputTemplate: outputTemplate);
    }

    Log.Logger = logConfig.CreateLogger();

    var builder = Microsoft.Extensions.Hosting.Host.CreateApplicationBuilder(args);

    builder.Services.AddLogging(it =>
    {
        it.ClearProviders();
        it.AddSerilog(dispose: true);
    });

    configBuilder?.Invoke(builder);

    var app = builder.Build();

    return app;
}
上一篇
下一篇