log4j.rootLogger=DEBUG,DATABASE log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender 
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test 
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver 
log4j.appender.DATABASE.user=root 
log4j.appender.DATABASE.password= 
log4j.appender.DATABASE.sql=INSERT INTO logs (Message) valueS ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n') 
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout 
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n 

解决方案 »

  1.   

    上面的例子可能有问题, 请参考下面这个:
    ----------------------------------------
    # 定义输出端
    log4j.rootLogger = INFO, A3# 定义A3输出到数据库
    log4j.appender.A3 = org.apache.log4j.jdbc.JDBCAppender
    log4j.appender.A3.BufferSize = 40
    log4j.appender.A3.Driver = com.microsoft.jdbc.sqlserver.SQLServerDriver
    log4j.appender.A3.URL = jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=nepalon
    log4j.appender.A3.User = sa
    log4j.appender.A3.Password = 
    log4j.appender.A3.layout = org.apache.log4j.PatternLayout
    log4j.appender.A3.layout.ConversionPattern = INSERT INTO log4j (createDate, thread, priority, category, message) values(getdate(), '%t', '%-5p', '%c', '%m')
      

  2.   

    那么配置文件是这么做的,如何在程序中使用呢?
      <appender name="access_db_log" class="org.apache.log4j.jdbc.JDBCAppender">
          <param name="Driver" value="oracle.jdbc.driver.OracleDriver" />
          <param name="Sql" value="INSERT INTO ak(Timestamp,Userid, Officeid, AccesstypeExtstring) VALUES (?,?,?)" />
         <param name="User" value="username" />
         <param name="URL" value="jdbc:oracle:thin:@192.168.99.16:1521:maojs" />
         <param name="Password" value="pwd" />
         <param name="BufferSize" value="2" />
    </appender>
    特别是如何将values中的?,赋值呢?
      

  3.   

    一般好像只在log4j.properties中配置就可以了把
    然后放到classes下就能自动识别了
    不过我觉得像放到数据库里面的数据最好还是先识别一下
    看看那些是有用的那些不是
      

  4.   

    上面的内容全部放在 log4j.properties 文件中,
    在程序中如何引用你随便找个关于 log4j 的参考文档都有讲,这里也不能一两句说完.
      

  5.   

    你要的这种日志,如果使用log4j默认的appender,userid和officeid只能写在一个
    字段里面,如果你想写入不同的字段,你必须自己实现log4j的org.apache.log4j.Appender接口。
      

  6.   

    to:xiaoxi,没有其他的办法了吗?要想实现这个接口如何实现?
      

  7.   

    一般用法申明:
    private static final Logger log = Logger.getLogger(ServiceController.class);
    调用
    log.info("Hello World.");
    log.debuf("Hello World.");
    你的信息就只能写为一个字符串,它就是“%m”。如果要区分%m里面的信息,只能自己实现Appender。
      

  8.   

    类:
    http://logging.apache.org/log4j/docs/api/org/apache/log4j/jdbc/JDBCAppender.html参考下面文章:
    http://blog.yesky.com/Blog/tiantian911/archive/2005/02/15/74717.html
      

  9.   

    只要你配置好了 log4j.properties ,在程序中使用的代码都是一样的.不管输出到显示器,文件还是数据库,都可以用类似代码写入日志:log.info("information");
      

  10.   

    但是我得sql得语句中的Userid,怎么通过log.info写入信息呢?Userid是动态从别的地方取到的!!
      

  11.   

    既然 id 是动态的, 那为什么不将日志写在文件中.你这样是不得为每个人建一个不同的 log4j.properties
      

  12.   

    to rootcn是我要自己定义一个输出日志的方法,不过是包装log4j,public void outputLog(String uid,String ofcid,String accType,long kid,long ext,String extString){
                
                Logger loger=Loger.getIntance("....")
                
               .....
               这里该如何使得配置文件中的sql中的?换成方法传进来得具体的值呢?
    }
      

  13.   

    public void outputLog(String uid,String ofcid,String accType,long kid,long ext,String extString){
                
                Logger loger=Loger.getIntance("....")
                loger.info("已经成功加载.");
    }
    log4j.properties 放在同一个目录就可以...另外补一句,用过 log4j 吗?
      

  14.   

    我仔细看过log4j.dtd,所有被配置Appender都会写入日志。
    也就是说,你不可能定义一个appender,只在某种情况下使用,
    这是不可能的。而且,你需要的格式,还需要自己实现Appender接口,
    太麻烦了。建议放弃。
      

  15.   

    如果对数据库要操作很多, 建议用 JDBC 吧.
      

  16.   

    to  rootcn(沙砾) 我用过log4j,你所说的log.info(userid)会将数据插入到数据库的userid这一列下吗?它只会作为一个message插入到converpatten得%m格式所对应的字段里吧
      

  17.   

    是的,以log4j (createDate, thread, priority, category, message) values(getdate(), '%t', '%-5p', '%c', '%m')
    为例:数据库中新建表:log4j (
        createDate,
        thread,
        priority,
        category,
        message)每写一条log4j的消息(即 log4j.info("kkk")),在 log4j 表中加入一行, "kkk"会添加在 message 列中,其它的自动补上.你要是将"kkk" 变成 "userid=222 info=成功登录" 也是可以变通的...
    但你要是想直接将信息添加到某个现成表AA中的一列中, 
    直接将 log4j 表换成AA表,并指定某一列名.
    但这是不能判断加在哪一条已有记录的后面, 是新生成的...
      

  18.   

    以下为我的同事写出来的,我已经试过了,供大家分享
    配置文件:
     
     <appender name="access_Log_JDBC" class="org.apache.log4j.jdbc.JDBCAppender">
         <param name="Driver" value="oracle.jdbc.driver.OracleDriver" />
         <param name="URL" value="jdbc:oracle:thin:@192.168.99.213:1521:akapi" />
         <param name="user" value="accesslog" />
         <param name="password" value="log" />
         <param name="sql" value="INSERT INTO t(date,user,b,c) VALUES (%d, '%X{user}', '%X{b}', '%m')" />
         <param name="BufferSize" value="1" />
      </appender>   <category name="accesslog_category">
        <priority value="debug" />
        <appender-ref ref="access_Log_JDBC" />
        <appender-ref ref="CONSOLE" />
      </category>
     
    通过MDC访问log的例子程序:
    public class AccessLogFactory {
      private static final String ACCESSLOG_CATEGORY = "accesslog_category";
     
     static{
      DOMConfigurator.configure("./conf/log4j.xml");
     } public static Log getLog() {
      
      Log logger = null;
      
      try {
       logger = LogFactory.getLog(ACCESSLOG_CATEGORY);
      } catch (LogConfigurationException e) {
        e.printStackTrace();
      }
      
      return logger;
     }
     
     public static void main(String[] args){
      Log logger = AccessLogFactory .getLog();
      String msg = "b03";
      String user = "u03";
      String b = "b03";
      MDC.put("user", user);  //和配置文件中的%X{user}对应
      MDC.put("b", b);  //和配置文件中的%X{b}对应
      logger.error(msg); //和配置文件中的%m对应
      
     
      msg = "b04";
      user  = "u04";
      b = "b04";
      MDC.put("user ", user );
      MDC.put("b", b);
      logger.error(msg);
     }
    }