Serilog是.NET Core中现在流行的结构化日志类库,支持MSSQL、Mysql、SQLLite等多种数据库,配置简单,支持输出文本、数据库、缓存等。
在输出到数据库时,若连接MSSQL想配置自定义列,可以很容易的用ColumnOptions进行自定义列扩展,如
var columnOpts = new ColumnOptions();
//columnOpts.Store.Remove(StandardColumn.Properties);
//columnOpts.Store.Add(StandardColumn.LogEvent);
//columnOpts.LogEvent.DataLength = 2048;
//columnOpts.PrimaryKey = columnOpts.TimeStamp;
//columnOpts.TimeStamp.NonClusteredIndex = true;
columnOpts.Store.Remove(StandardColumn.MessageTemplate);
columnOpts.Properties.ExcludeAdditionalProperties = true;
columnOpts.AdditionalColumns = new Collection<SqlColumn>
{
new SqlColumn{DataType = System.Data.SqlDbType.NVarChar, DataLength = 32, ColumnName = "IP"}
};
在program.cs配置
builder.Host.UseSerilog((context, logger) =>
{
logger.WriteTo.MSSqlServer(
connectionString: logDB,
sinkOptions: sinkOpts,
columnOptions: columnOpts
);
};
但是如果连接的是mysql数据库,不能直接的用.WriteTo.Mysql配置,需要通过Serilog.Sinks.MariaDB进行连接。
//引用
using Serilog.Sinks.MariaDB;
using Serilog.Sinks.MariaDB.Extensions;
在program.cs这样注册
builder.Host.UseSerilog((context, logger) =>//注册Serilog
{
logger.ReadFrom.Configuration(context.Configuration);
logger.Enrich.FromLogContext();// 注册日志上下文//.Enrich.WithProperty("IP", "8.8.8.8")
logger.WriteTo.MariaDB(
connectionString: builder.Configuration.GetConnectionString("ConnStr"),
tableName: "Logs",
autoCreateTable: true,
options: new MariaDBSinkOptions()
);
});
同时需要在appsettings.json进行自定义列的配置
"WriteTo": [
{
"Name": "MariaDB",
"Args": {
"autoCreateTable": true, //自动创建表
"tableName": "Logs",
"restrictedToMinimumLevel": "Debug",
//"batchPostingLimit": 1000,
//"period": "0.00:00:30",
"options": {
"PropertiesToColumnsMapping": {
"Timestamp": "Timestamp",
"Ts": "Ts",//自定义
"Level": "Level",
"ActionName": "ActionName",//自定义
"RequestPath": "RequestPath",//自定义
"IP": "IP",//自定义
"Param": "Param",
"Message": "Message",
"Exception": "Exception",
"User": "User",//自定义
"MessageTemplate": "MessageTemplate",
"Properties": "Properties"
},
"TimestampInUtc": false, //Timestamp列是否为UTC时间
//"ExcludePropertiesWithDedicatedColumn": true,/
}
}
}
]
PropertiesToColumnsMapping就是可以在默认的log列之外,添加自定义列。autoCreateTable配置为true会自动创建log表。
另外,要对自定义列进行赋值,需要使用using()格式,如
using (LogContext.PushProperty("ActionName", "{ActionName}"))
using (LogContext.PushProperty("RequestPath", "{RequestPath}"))
using (LogContext.PushProperty("IP", context.HttpContext.Request.Host.Value))
using (LogContext.PushProperty("Param", JsonConvert.SerializeObject(context.ActionArguments)))
{
_logger.LogInformation(JsonConvert.SerializeObject(response));
}
·{ActionName}:执行方法名称
·{RequestPath}:请求路径
·context.HttpContext.Request.Host.Value:请求IP
·context.ActionArguments:请求参数
这样,就可以对mysql的log表进行自定义列的配置啦