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;
}