问题1: 在公司进行log4net写入服务器配置的时候,一切正常,但是在家里的机器上,就频繁出现这个问题:
SQL Server 2008 报错:已成功与服务器建立连接,但是在登录前的握手期间发生错误 
并且这种错误是随机性的,在log4net往数据库插入几条的时候,没问题,但是插入次数一多起来,就频繁报这个错误。后来没办法,网上搜罗了一圈,最终发现了解决方案:
 
将相关的TCP参数都设置为启动之后,就再没遇到过问题。
 
 问题2,log4net配置都正确,但是一直无法写入数据库。
这个问题困扰了好久,最终得以解决,大家就看看我的解决代码吧,我也懒得帖步骤了。
 
配置文件如下:
 <log4net>
<root>
<level value="WARN"/>
<level value="INFO"/>
<level value="DEBUG"/>
<level value="FINE"/>
<!--<appender-ref ref="LogFileAppender" />-->
<appender-ref ref="ADONetAppender" />
</root>
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
<!--文件名称-->
<file value="log.txt" />
<!--所有新的日志都进行追加-->
<appendToFile value="true" />
<!--文件名称格式-->
<datePattern value="-yyyy.MM.dd" />
<!--文件名按日期滚动-->
<rollingStyle value="Date" />
<maxSizeRollBackups value="10" />
<!--文件名称不固定,可变-->
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />
</layout>
</appender>
<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
<!--BufferSize为缓冲区大小,只有日志记录超1条才会一块写入到数据库-->
<bufferSize value="1"/>
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<connectionString value="Data Source=****;Initial Catalog=***;Persist Security Info=True;User ID=sa;Password=***;MultipleActiveResultSets=True"/>
<commandText value="INSERT INTO edu_log (Date,Thread,Level,Logger,Message,SchoolID,SysTypeID) values(@log_date,@thread,@log_level,@logger,@content,@s_id,@t_id)"/>
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<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="@content" />
<dbType value="String" />
<size value="4000" />
<layout type="FuNong.Framework.Logger.CustomLayout">
<conversionPattern value="%property{content}" />
</layout>
</parameter>
<parameter>
<parameterName value="@s_id" />
<dbType value="String" />
<size value="50" />
<layout type="FuNong.Framework.Logger.CustomLayout">
<conversionPattern value="%property{s_id}" />
</layout>
</parameter>
<parameter>
<parameterName value="@t_id" />
<dbType value="String" />
<size value="50" />
<layout type="FuNong.Framework.Logger.CustomLayout">
<conversionPattern value="%property{t_id}" />
</layout>
</parameter>
</appender>
</log4net>

注意上面配置代码中:log4net.Layout.PatternLayout 是log4net本身提供的配置模板,如果你有的字段需要用到其本身的模板字段的话,就可以使用。

还需要注意这段话: <conversionPattern value="%property{s_id}" />,它表明,我们将会利用log4net提供的已有的property转义模板来识别我们的字段。

但是如果你有自定义字段的话,你就需要自己写layout和converter了。在上面的配置文件中,content,s_id,t_id是我自定义的三个字段,如何让这三个字段也写入到数据库呢,我们一步一步来配置。

首先,需要将三个自定义字段放到一个entity类中:

namespace FuNong.Framework.Logger
{
public class LogContent
{
public LogContent(string content, string s_id, string t_id)
{
this.content = content;
this.s_id = s_id;
this.t_id = t_id;
} public string content { get; set; } public string s_id { get; set; }
public string t_id { get; set; }
}
}

然后,定义我们自己的layout,由于我们使用了property字段模板,所以我们这里需要按照如下方式添加:

namespace FuNong.Framework.Logger
{
public class CustomLayout:PatternLayout
{
public CustomLayout()
{
this.AddConverter("property", typeof(XPatternConverter));
}
}
}

最后,就是我们的Converter实现了:

namespace FuNong.Framework.Logger
{
public class XPatternConverter : PatternLayoutConverter
{
protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
{
if (this.Option != null)
{
// Write the value for the specified key
WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
}
else
{
// Write all the key value pairs
WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
} } /// <summary>
/// 通过反射获取传入的日志对象的某个属性的值
/// </summary>
/// <param name="property"></param>
/// <returns></returns>
private Object LookupProperty(String property, log4net.Core.LoggingEvent loggingEvent)
{
Object propertyValue = String.Empty;
PropertyInfo propertyInfo; propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);
if (propertyInfo != null)
{
propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null);
}
return propertyValue;
} }
}

从上面代码,我们可以看到,log4net会通过反射来识别我们logContent这个entity中的字段,然后逐个赋值,再写到数据库的。

下面我们稍微包装一下:

namespace FuNong.Framework.Logger
{
public interface ILoggerService
{
void Debug(object message);
void Error(object message);
void Fatal(object message);
void Info(object message);
void Warn(object message);
}
}
namespace FuNong.Framework.Logger
{
public class LoggerService:ILoggerService
{
public LoggerService()
{
log4net.Config.XmlConfigurator.Configure();
logger = LogManager.GetLogger(typeof(LoggerService));
} private readonly ILog logger; public void Info(object message)
{
logger.Info(message);
}
public void Warn(object message)
{
logger.Warn(message);
}
public void Debug(object message)
{
logger.Debug(message);
}
public void Error(object message)
{
logger.Error(message);
}
public void Fatal(object message)
{
logger.Fatal(message);
} }
}

由于我用了autofac做ioc,所以我们就直接看使用方法吧:

  protected override void OnAuthorization(AuthorizationContext filterContext)
{
if (auth)
{
var collection = cookie.GetCookieCollection("FuNong.UserInfo.Login");
if (collection == null)
{
logger.Warn(new LogContent("用户登陆信息提取失败,将会跳转到登陆界面...", "1", "2"));
filterContext.Result = new RedirectResult("Home/Login");
}
else
{
logger.Info(new LogContent("用户验证成功,请继续之前操作...","1","2"));
}
}
}

这样,当我们运行起来后,我们就发现,程序已经将数据写入数据库了。

整个配置不难,但是细节挺多,稍微不小心,就可能导致写入不到数据库。

Log4Net写入到数据库配置过程中的一些小问题备忘的更多相关文章

  1. 使用log4net连接Mysql数据库配置

    log4net配置: //Author:GaoBingBing [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net ...

  2. 菜鸟帮你跳过openstack配置过程中的坑

    一:前言 对于一个以前做java全栈工程师而言,而且没学过Linux,很少用虚拟机(还是在大学的时候简单的用过),去配置openstack我想我入的坑肯定比有基础的一定要多,躺在每个坑中徘徊思索的时间 ...

  3. 菜鸟帮你跳过openstack配置过程中的坑[文末新添加福利]

    一:前言 对于一个以前做java全栈工程师而言,而且没学过Linux,很少用虚拟机(还是在大学的时候简单的用过),去配置openstack我想我入的坑肯定比有基础的一定要多,躺在每个坑中徘徊思索的时间 ...

  4. Redis配置过程中的问题

    记录一下配置过程中的坑~~ 当Redis在服务器上安装完成后,get.set没有问题了,接下来在程序中使用看看... 首先 在配置文件redis.conf中,默认的bind 接口是127.0.0.1, ...

  5. CAS SSO:汇集配置过程中的错误解决方法

    本教程为gevin.me原创文章,转载请注明: CAS SSO:配置过程中的错误解决方法 | Gevin’s Blog 本文将收集在配置CAS SSO遇到的所有错误,希望对大家有帮助,也方便下次搭建的 ...

  6. ESXi与物理交换机静态链路聚合配置过程中的小陷阱

    作者:陆斌文章来自微信公众号:平台人生 内容简介:ESXi与物理交换机之间配置静态链路聚合时,因为静态链路聚合的特点,在进行down网卡和从虚拟交换机移除网卡的操作时,可能会无法完成故障流量切换,影响 ...

  7. springmvc配置过程中遇到的一些问题总结

    springmvc配置过程中遇到的一些问题总结 1.配置tomcat过程中的错误: 2.配置web.xml中DispatchServlet报红(配置好已有依赖条件下) 解决的办法: 因为新添加依赖,m ...

  8. ACM 做题过程中的一些小技巧。

    ACM做题过程中的一些小技巧. 1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 2.有时候int型不够用,可以用long l ...

  9. 使用Mac的过程中的一些小操作

    前言:使用Mac的过程中的一些小操作 查看Mac系统是32位还是64位: 方法1: 点击左上角的苹果按钮->关于本机->概览->系统报告->软件->偏好设置面板:右侧有提 ...

随机推荐

  1. git 查看远程分支、本地分支、删除本地分支

    1 查看远程分支 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $ git branch -a   * br-2.1.2.2   master   remotes/origi ...

  2. Mac显示隐藏文件的终端命令

    显示:defaults write com.apple.finder AppleShowAllFiles -bool true隐藏:defaults write com.apple.finder Ap ...

  3. 使用Ant构建struts2 web工程,自动编译,打包成war

    c&c++语言通常使用make脚本来构建和管理自己的工程,同样java也有自己的构建工具(Ant),使用时需要写一个biuld.xml,有点类似c&c++里的makefile. 一.首 ...

  4. Java中的 WeakReference 和 SoftReference

    我们知道Java语言中没有指针,取而代之的是引用reference.Java中的引用又可以分为四种:强引用,弱引用(WeakReference),软引用(SoftReference),虚引用(Phan ...

  5. Remoting和Webservice的区别

    其实现的原理并没有本质的区别,在应用开发层面上有以下区别:1.Remoting可以灵活的定义其所基于的协议,如果定义为HTTP,则与Web Service就没有什么区别了,一般都喜欢定义为TCP,这样 ...

  6. Sping mvc 环境下使用kaptcha 生成验证码

    一.kaptcha 的简介 kaptcha 是一个非常实用的验证码生成工具.有了它,你可以生成各种样式的验证码,因为它是可配置的.kaptcha工作的原理是调用 com.google.code.kap ...

  7. 烂泥:centos安装及配置DHCP服务器

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 有关DHCP服务器的配置一直打算学习,这几天终于抽出时间来专门学习这个知识点. DHCP:动态主机配置协议,在此就不多做介绍.不清楚的童鞋,可以去百度下 ...

  8. openwrt简单ipk生成及Makefile解释

    前言 类似的文章其实网上比较多了,我写这个的目的: 1,网上文章良莠不齐,有些自己都没实际动手操作,随便复制粘贴,实际操作不可行. 2,基本只讲了操作,我当时最关心的Makefile文件的解释没有. ...

  9. lvs realserver 配置VIP

    # $# 表示提供到shell脚本或者函数的参数总数: # 1表示只有一个参数. #/bin/bash #file: tun_RS.sh if [ $# -ne 1 ]; then echo “usa ...

  10. [转]Ionic – Mobile UI Framework for PhoneGap/Cordova Developers

    本文转自:http://devgirl.org/2014/01/20/ionic-mobile-ui-framework-for-phonegapcordova-developers/ Ionic i ...