网上一大堆log4net 配置,日志存入数据库,尤其豆包给的配置全是错的,垃圾
找deepseek终于正确了,前后豆包浪费了我一个小时
注意:<log4net>外层没有<configuration>
创建表Sql语句:
sql
CREATE TABLE log (
Id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键',
LogTime DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '日志时间',
Level VARCHAR(20) NOT NULL COMMENT '日志级别',
Logger VARCHAR(255) COMMENT '日志类名',
Message TEXT COMMENT '日志信息',
Exception TEXT COMMENT '异常堆栈',
Thread VARCHAR(50) COMMENT '线程号',
IpAddress VARCHAR(100) COMMENT '客户端IP'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
正确配置:
XML
<?xml version="1.0" encoding="utf-8"?>
<log4net debug="true">
<!-- ========== 定义输出到 MySQL 的 Appender ========== -->
<appender name="AdoNetAppender_MySql" type="log4net.Appender.ADONetAppender">
<!-- 缓冲大小设为1,每写一条立即提交,便于调试(生产环境可按需调大) -->
<bufferSize value="1" />
<!-- 关闭事务,避免事务未提交导致数据丢失(测试时可开启,生产建议根据需求) -->
<useTransactions value="false" />
<!-- 1. MySQL 驱动:不指定具体版本,由 .NET 自动加载项目引用的 MySql.Data -->
<connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" />
<!-- 2. 连接字符串(!!!请替换为你自己的 MySQL 连接信息 !!!) -->
<connectionString value="server=127.0.0.1;user id=root;password=525625;database=testdb;port=3306;CharSet=utf8;Pooling=True;" />
<!-- 3. SQL 插入语句(字段名用反引号包裹,防止与保留字冲突) -->
<commandText value="
INSERT INTO `log` (`LogTime`, `Level`, `Logger`, `Message`, `Exception`, `Thread`, `IpAddress`)
VALUES (?log_time, ?log_level, ?logger, ?message, ?exception, ?thread, ?ip)
" />
<!-- ====== 参数定义(顺序必须与 SQL 中的字段顺序一致) ====== -->
<!-- 日志时间 -->
<parameter>
<parameterName value="?log_time" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<!-- 日志级别 -->
<parameter>
<parameterName value="?log_level" />
<dbType value="String" />
<size value="20" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<!-- 记录器名称(通常是类名) -->
<parameter>
<parameterName value="?logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<!-- 日志消息 -->
<parameter>
<parameterName value="?message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<!-- 异常信息(允许为空) -->
<parameter>
<parameterName value="?exception" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%exception" />
</layout>
<!-- 关键:如果日志没有异常,允许插入 NULL -->
<allowNull value="true" />
</parameter>
<!-- 线程名称 -->
<parameter>
<parameterName value="?thread" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<!-- IP 地址(从全局上下文中获取,需在代码中设置) -->
<parameter>
<parameterName value="?ip" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{ip}" />
</layout>
<!-- 如果未设置 ip 属性,允许插入 NULL(或空字符串,取决于表定义) -->
<allowNull value="true" />
</parameter>
</appender>
<!-- ========== 根日志器:所有日志都使用上面的 Appender ========== -->
<root>
<level value="ALL" />
<appender-ref ref="AdoNetAppender_MySql" />
</root>
</log4net>