﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-PariScamper的java天空-随笔分类-Others</title><link>http://www.blogjava.net/PariScamper/category/26374.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 02 Mar 2008 13:18:52 GMT</lastBuildDate><pubDate>Sun, 02 Mar 2008 13:18:52 GMT</pubDate><ttl>60</ttl><item><title>关于“vsftpd 部分本地用户不能登录”的问题解决   </title><link>http://www.blogjava.net/PariScamper/archive/2008/02/27/182568.html</link><dc:creator>PariScamper</dc:creator><author>PariScamper</author><pubDate>Wed, 27 Feb 2008 14:45:00 GMT</pubDate><guid>http://www.blogjava.net/PariScamper/archive/2008/02/27/182568.html</guid><wfw:comment>http://www.blogjava.net/PariScamper/comments/182568.html</wfw:comment><comments>http://www.blogjava.net/PariScamper/archive/2008/02/27/182568.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/PariScamper/comments/commentRss/182568.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/PariScamper/services/trackbacks/182568.html</trackback:ping><description><![CDATA[以下文章在我配置vsftpd时有帮助，特转载：<br />
<br />
关于&#8220;vsftpd 部分本地用户不能登录，部分可以&#8221;的问题，我重新做了一些实验，我把这个问题结合实验的结果再重新描述一下，请各位高人，帮忙看看可能的原因。 谢谢了！<br />
<br />
系统中原来就有的本地帐号都不能登录，我的/etc/vsftpd/vsftpd.conf文件的配置如下：<br />
local_enable=YES<br />
write_enable=YES<br />
chroot_local_user=YES<br />
pam_service_name=vsftpd<br />
/etc/pam.d/vsftpd存在且正常。<br />
<br />
登录时错误信息都是一样的：<br />
500 OOPS: cannot change directory:/home/xxxx<br />
Login failed.<br />
421 Service not available, remote server has closed connection<br />
<br />
他们的home目录都是/home/xxxx。/home和/home/xxxx的权限都是755。<br />
以上这些帐号都不能ftp登录，这些都是平常经常使用的，可以用shell登录的。<br />
<br />
我新创建了一个usr1帐号，<br />
# useradd -G test -d /tmp/usr1 usr1<br />
能ftp登录，他的home为/tmp/usr1,在/分区上。而/home我是mount到/dev/hda9上的。<br />
#mount<br />
/dev/hdb1 on / type ext3 (rw)<br />
/dev/hda9 on /home type ext2 (rw)<br />
<br />
所以，我猜想：是否是由于/home分区的原因，而造成&#8220;主目录在/home分区的帐号&#8221;都不能登录呢？<br />
<br />
为了验证以上设想，我试着再创建了一个帐号，<br />
useradd -G test -d /home/usr3 usr3<br />
/home, /home/usr3 的权限都是755。<br />
<br />
usr3 ftp登录失败。 <br />
500 OOPS: cannot change directory:/home/usr3<br />
Login failed.<br />
421 Service not available, remote server has closed connection<br />
<br />
至此，我觉得可以确定是由于/home分区的原因，而造成&#8220;主目录在/home分区的帐号&#8221;都不能登录。<br />
参考文章：<br />
-----------------------------------------------------------------------------------------<br />
I finished my second upgrade to Fedora Core 4. Not everything is ironed out yet with the build of course. But one thing is for sure a lot has happened to the RedHat I knew before.<br />
<br />
I must say of all the changes, for me the nicest addition is the new SELinux extensions. For deep background on the reasons for and theory of SELinux read, The Inevitability of Failure: The Flawed Assumption of Security in Modern Computing Environments<br />
<br />
The more I work with SELinux the more I realize I need to know about it, and how exactly it does all its stuff. It certainly changes things relating to users, directories and access. As I am starting to learn it, I'm sure I'm doing things the hard-way. :)<br />
<br />
The major difference, so far for me, in Red Hat's SELinux is the way ftp is handled. vsftpd is still the server which is great. However, it seems to be designed to run as a daemon rather than invoked via xinet.d. If you grab a working copy of the xinet.d file for vsftpd you can invoke it via xinet.d wrapper. I did my first server upgrade in this manner. The current one I am trying as a daemon. I certainly think I will miss some of the features that the xinet.d wrapper brings, and may yet return to it.<br />
<br />
Of all the issues I saw most notable is if you want to enable chroot directory's outside of the normal /home/xxx vsftpd. These will fail with a<br />
<br />
&nbsp; &nbsp; 500 OOPS: cannot change directory: /mnt/xxxxx<br />
<br />
I was able to use ftp if I logged in with an account with a directory in /home, but once I set a user account to have a home drive outside of /home (in this case on a mounted secondary disk) vsftpd barfs the above.<br />
<br />
<br />
I found information at the NSA that indicates you can disable SELinux protection of the ftp daemon.<br />
<br />
&nbsp; &nbsp; setsebool -P ftpd_disable_trans 1<br />
<br />
This seems a bit drastic. It certainly works for now though.<br />
<br />
I think ultimately the issue resides with policies, but as SELinux policies are new to me, it will take time before it all gets sorted out. As I spend time with the new SELinux extensions in Fedora Core 4 I will keep you updated on my thoughts and configuration lessons.<br />
<br />
<br />
---------------------------------------------------------------------------------------<br />
<br />
解决办法：<br />
--------------------------------------------------------------------------------------<br />
&nbsp;# setsebool ftpd_disable_trans 1<br />
&nbsp;&nbsp;# service vsftpd restart<br />
我用的是FC4，按照你上一帖子里的方法试了，马上就解决了。所以，可以确定原因就在SELinux。<br />
------------------------------------------------------------------------------------<br />
<br />
<img src ="http://www.blogjava.net/PariScamper/aggbug/182568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/PariScamper/" target="_blank">PariScamper</a> 2008-02-27 22:45 <a href="http://www.blogjava.net/PariScamper/archive/2008/02/27/182568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>commons-logging和Log4j 日志管理 (zz)</title><link>http://www.blogjava.net/PariScamper/archive/2007/12/12/167232.html</link><dc:creator>PariScamper</dc:creator><author>PariScamper</author><pubDate>Wed, 12 Dec 2007 06:48:00 GMT</pubDate><guid>http://www.blogjava.net/PariScamper/archive/2007/12/12/167232.html</guid><wfw:comment>http://www.blogjava.net/PariScamper/comments/167232.html</wfw:comment><comments>http://www.blogjava.net/PariScamper/archive/2007/12/12/167232.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/PariScamper/comments/commentRss/167232.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/PariScamper/services/trackbacks/167232.html</trackback:ping><description><![CDATA[什么要用日志（<span lang="EN-US"><font face="Times New Roman">Log</font></span><span style="font-family: 宋体">）</span><span lang="EN-US"><font face="Times New Roman">?<br />
</font></span><span style="font-family: 宋体">这个&#8230;&#8230;就不必说了吧。</span>
<p><font size="1"><span style="font-family: 宋体">为什么不用</span><span lang="EN-US"><font face="Times New Roman">System.out.println()?<br />
</font></span></font><span style="font-family: 宋体">功能太弱；不易于控制。如果暂时不想输出了怎么办？如果想输出到文件怎么办？如果想部分输出怎么办？&#8230;&#8230;</span> </p>
<p><font size="1"><span style="font-family: 宋体">为什么同时使用</span><span lang="EN-US"><font face="Times New Roman">commons-logging</font></span><span style="font-family: 宋体">和</span><span lang="EN-US"><font face="Times New Roman">Log4j?</font></span><span style="font-family: 宋体">为什么不仅使用其中之一？<br />
</span></font><span lang="EN-US"><font face="Times New Roman">Commons-loggin</font></span><span style="font-family: 宋体">的目的是为&#8220;所有的</span><span lang="EN-US"><font face="Times New Roman">Java</font></span><span style="font-family: 宋体">日志实现&#8221;提供一个统一的接口，它自身的日志功能平常弱（只有一个简单的</span><span lang="EN-US"><font face="Times New Roman">SimpleLog?</font></span><span style="font-family: 宋体">），所以一般不会单独使用它。</span> </p>
<p><span lang="EN-US"><font face="Times New Roman">Log4j</font></span><span style="font-family: 宋体">的功能非常全面强大，是目前的首选。我发现几乎所有的</span><span lang="EN-US"><font face="Times New Roman">Java</font></span><span style="font-family: 宋体">开源项目都会用到</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span><span style="font-family: 宋体">，但我同时发现，所有用到</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span><span style="font-family: 宋体">的项目一般也同时会用到</span><span lang="EN-US"><font face="Times New Roman">commons-loggin</font></span><span style="font-family: 宋体">。我想，大家都不希望自己的项目与</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span><span style="font-family: 宋体">绑定的太紧密吧。另外一个我能想到的&#8220;同时使用</span><span lang="EN-US"><font face="Times New Roman">commons-logging</font></span><span style="font-family: 宋体">和</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span><span style="font-family: 宋体">&#8221;的原因是，简化使用和配置。</span> </p>
<p><span lang="EN-US"><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><strong><span style="font-family: 宋体">强调一点，&#8220;同时使用</span><span lang="EN-US"><font face="Times New Roman">commons-logging</font></span></strong><strong><span style="font-family: 宋体">和</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span></strong><strong><span style="font-family: 宋体">&#8221;，与&#8220;单独使用</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span></strong><strong><span style="font-family: 宋体">&#8221;相比，并不会带来更大的学习、配置和维护成本，反而更加简化了我们的工作。</span></strong><span style="font-family: 宋体">我想这也是为什么&#8220;所有用到</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span><span style="font-family: 宋体">的项目一般也同时会用到</span><span lang="EN-US"><font face="Times New Roman">commons-loggin</font></span><span style="font-family: 宋体">&#8221;的原因之一吧。</span> </p>
<p><font size="1"><span lang="EN-US"><font face="Times New Roman">Commons-logging</font></span><span style="font-family: 宋体">能帮我们做什么？<br />
</span></font><span lang="EN-US" style="font-family: Wingdings"><span>l<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></span><span style="font-family: 宋体">提供一个统一的日志接口，简单了操作，同时避免项目与某个日志实现系统紧密</span><span lang="EN-US"><font face="Times New Roman">a</font></span><span style="font-family: 宋体">耦合</span> <br />
<span lang="EN-US" style="font-family: Wingdings"><span>l<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></span><span style="font-family: 宋体">很贴心的帮我们自动选择适当的日志实现系统（这一点非常好！）</span> <br />
<span lang="EN-US" style="font-family: Wingdings"><span>l<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></span><span style="font-family: 宋体">它甚至不需要配置</span> </p>
<p><span style="font-family: 宋体">这里看一下它怎么&#8220;&#8216;很贴心的&#8217;帮我们&#8216;自动选择&#8217;&#8216;适当的&#8217;日志实现系统&#8221;：</span> <br />
<span lang="EN-US"><span><font face="Times New Roman">1)<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></font></span></span><span style="font-family: 宋体">首先在</span><span lang="EN-US"><font face="Times New Roman">classpath</font></span><span style="font-family: 宋体">下寻找自己的配置文件</span><span lang="EN-US"><font face="Times New Roman">commons-logging.properties</font></span><span style="font-family: 宋体">，如果找到，则使用其中定义的</span><span lang="EN-US"><font face="Times New Roman">Log</font></span><span style="font-family: 宋体">实现类；</span> <br />
<span lang="EN-US"><span><font face="Times New Roman">2)<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></font></span></span><span style="font-family: 宋体">如果找不到</span><span lang="EN-US"><font face="Times New Roman">commons-logging.properties</font></span><span style="font-family: 宋体">文件，则在查找是否已定义系统环境变量</span><span lang="EN-US"><font face="Times New Roman">org.apache.commons.logging.Log</font></span><span style="font-family: 宋体">，找到则使用其定义的</span><span lang="EN-US"><font face="Times New Roman">Log</font></span><span style="font-family: 宋体">实现类；</span> <br />
<span lang="EN-US"><span><font face="Times New Roman">3)<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></font></span></span><span style="font-family: 宋体">否则，查看</span><span lang="EN-US"><font face="Times New Roman">classpath</font></span><span style="font-family: 宋体">中是否有</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span><span style="font-family: 宋体">的包，如果发现，则自动使用</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span><span style="font-family: 宋体">作为日志实现类；</span> <br />
<span lang="EN-US"><span><font face="Times New Roman">4)<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></font></span></span><span style="font-family: 宋体">否则，使用</span><span lang="EN-US"><font face="Times New Roman">JDK</font></span><span style="font-family: 宋体">自身的日志实现类（</span><span lang="EN-US"><font face="Times New Roman">JDK1.4</font></span><span style="font-family: 宋体">以后才有日志实现类）；</span> <br />
<span lang="EN-US"><span><font face="Times New Roman">5)<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></font></span></span><span style="font-family: 宋体">否则，使用</span><span lang="EN-US"><font face="Times New Roman">commons-logging</font></span><span style="font-family: 宋体">自己提供的一个简单的日志实现类</span><span lang="EN-US"><font face="Times New Roman">SimpleLog</font></span><span style="font-family: 宋体">；</span> <br />
<span style="font-family: 宋体">（以上顺序不保证完全准确，请参考官方文档）</span> </p>
<p><span style="font-family: 宋体">可见，</span><span lang="EN-US"><font face="Times New Roman">commons-logging</font></span><span style="font-family: 宋体">总是能找到一个日志实现类，并且尽可能找到一个&#8220;最合适&#8221;的日志实现类。我说它&#8220;很贴心&#8221;实际上是因为：</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="font-family: 宋体">、可以不需要配置文件；</span><span lang="EN-US"><font face="Times New Roman">2</font></span><span style="font-family: 宋体">、自动判断有没有</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span><span style="font-family: 宋体">包，有则自动使用之；</span><span lang="EN-US"><font face="Times New Roman">3</font></span><span style="font-family: 宋体">、最悲观的情况下也总能保证提供一个日志实现（</span><span lang="EN-US"><font face="Times New Roman">SimpleLog</font></span><span style="font-family: 宋体">）。</span>&nbsp;<br />
<span lang="EN-US"><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体">可以看到，</span><span lang="EN-US"><font face="Times New Roman">commons-logging</font></span><span style="font-family: 宋体">对编程者和</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span><span style="font-family: 宋体">都非常友好。</span> </p>
<p><span lang="EN-US"><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><strong><span style="font-family: 宋体">为了简化配置</span><span lang="EN-US"><font face="Times New Roman">commons-logging</font></span></strong><strong><span style="font-family: 宋体">，一般不使用</span><span lang="EN-US"><font face="Times New Roman">commons-logging</font></span></strong><strong><span style="font-family: 宋体">的配置文件，也不设置与</span><span lang="EN-US"><font face="Times New Roman">commons-logging</font></span></strong><strong><span style="font-family: 宋体">相关的系统环境变量，而只需将</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span></strong><strong><span style="font-family: 宋体">的</span><span lang="EN-US"><font face="Times New Roman">Jar</font></span></strong><strong><span style="font-family: 宋体">包放置到</span><span lang="EN-US"><font face="Times New Roman">classpash</font></span></strong><strong><span style="font-family: 宋体">中就可以了。这样就很简单地完成了</span><span lang="EN-US"><font face="Times New Roman">commons-logging</font></span></strong><strong><span style="font-family: 宋体">与</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span></strong><strong><span style="font-family: 宋体">的融合。</span></strong><span style="font-family: 宋体">如果不想用</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span><span style="font-family: 宋体">了怎么办？只需将</span><span lang="EN-US"><font face="Times New Roman">classpath</font></span><span style="font-family: 宋体">中的</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span><span style="font-family: 宋体">的</span><span lang="EN-US"><font face="Times New Roman">Jar</font></span><span style="font-family: 宋体">包删除即可。<br />
<br />
</span><span style="font-family: 宋体">就这么简单！</span> </p>
<p><span style="font-family: 宋体"><font size="1">代码应该怎么写？</font></span></p>
<p><span style="font-family: 宋体">我们在需要输出日志信息的&#8220;每一人&#8221;类中做如下的三个工作：</span> <br />
<span lang="EN-US"><font face="Times New Roman">1</font></span><span style="font-family: 宋体">、导入所有需的</span><span lang="EN-US"><font face="Times New Roman">commongs-logging</font></span><span style="font-family: 宋体">类：</span> <br />
<span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman">import org.apache.commons.logging.Log; <br />
</font></span><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman">import org.apache.commons.logging.LogFactory; </font></span></p>
<p><span style="font-family: 宋体">如果愿意简化的话，还可以两行合为一行：</span> <br />
<span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman">import org.apache.commons.logging.*;&nbsp;</font></span><span lang="EN-US">&nbsp;</span> </p>
<p><span lang="EN-US"><font face="Times New Roman">2</font></span><span style="font-family: 宋体">、在自己的类中定义一个</span><span lang="EN-US"><font face="Times New Roman">org.apache.commons.logging.Log</font></span><span style="font-family: 宋体">类的私有静态类成员：</span> <br />
<span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman">private static Log log = LogFactory.getLog(YouClassName.class); </font></span></p>
<p><span style="font-family: 宋体">注意这里定义的是</span><span lang="EN-US"><font face="Times New Roman">static</font></span><span style="font-family: 宋体">成员，以避免产生多个实例。</span> </p>
<p><span lang="EN-US"><font face="Times New Roman">LogFactory.getLog()</font></span><span style="font-family: 宋体">方法的参数使用的是当前类的</span><span lang="EN-US"><font face="Times New Roman">class</font></span><span style="font-family: 宋体">，这是目前被普通认为的最好的方式。为什么不写作</span><span lang="EN-US"><font face="Times New Roman">LogFactory.getLog(this.getClass())</font></span><span style="font-family: 宋体">？因为</span><span lang="EN-US"><font face="Times New Roman">static</font></span><span style="font-family: 宋体">类成员访问不到</span><span lang="EN-US"><font face="Times New Roman">this</font></span><span style="font-family: 宋体">指针！</span> </p>
<p><span lang="EN-US"><font face="Times New Roman">3</font></span><span style="font-family: 宋体">、使用</span><span lang="EN-US"><font face="Times New Roman">org.apache.commons.logging.Log</font></span><span style="font-family: 宋体">类的成员方法输出日志信息：</span> <br />
<span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman">log.debug("111"); <br />
</font></span><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman">log.info("222"); <br />
</font></span><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman">log.warn("333"); <br />
</font></span><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman">log.error("444"); <br />
</font></span><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman">log.fatal("555"); </font></span></p>
<p><span style="font-family: 宋体">这里的</span><span lang="EN-US"><font face="Times New Roman">log</font></span><span style="font-family: 宋体">，就是上面第二步中定义的类成员变量，其类型是</span><span lang="EN-US"><font face="Times New Roman">org.apache.commons.logging.Log</font></span><span style="font-family: 宋体">，通过该类的成员方法，我们就可以将不同性质的日志信息输出到目的地（目的地是哪里？视配置可定，可能是</span><span lang="EN-US"><font face="Times New Roman">stdout</font></span><span style="font-family: 宋体">，也可能是文件，还可能是发送到邮件，甚至发送短信到手机&#8230;&#8230;详见下文对</span><span lang="EN-US"><font face="Times New Roman">log4j.properties</font></span><span style="font-family: 宋体">的介绍）：</span> <br />
<span lang="EN-US" style="font-family: Wingdings"><span>l<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></span><span lang="EN-US"><font face="Times New Roman">debug()<span>&nbsp;&nbsp; </span></font></span><span style="font-family: 宋体">输出&#8220;调试&#8221;级别的日志信息；</span> <br />
<span lang="EN-US" style="font-family: Wingdings"><span>l<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></span><span lang="EN-US"><font face="Times New Roman">info()<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span><span style="font-family: 宋体">输出&#8220;信息&#8221;级别的日志信息；</span> <br />
<span lang="EN-US" style="font-family: Wingdings"><span>l<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></span><span lang="EN-US"><font face="Times New Roman">warn()<span>&nbsp;&nbsp;&nbsp; </span></font></span><span style="font-family: 宋体">输出&#8220;警告&#8221;级别的日志信息；</span> <br />
<span lang="EN-US" style="font-family: Wingdings"><span>l<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></span><span lang="EN-US"><font face="Times New Roman">error()<span>&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span><span style="font-family: 宋体">输出&#8220;错误&#8221;级别的日志信息；<br />
</span><span lang="EN-US" style="font-family: Wingdings"><span>l<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></span><span lang="EN-US"><font face="Times New Roman">fatal()<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span><span style="font-family: 宋体">输出&#8220;致命错误&#8221;级别的日志信息；</span> </p>
<p><strong><span style="font-family: 宋体">根据不同的性质，日志信息通常被分成不同的级别，从低到高依次是：&#8220;调试（</span><span lang="EN-US"><font face="Times New Roman">DEBUG</font></span></strong><strong><span style="font-family: 宋体">）&#8221;&#8220;信息（</span><span lang="EN-US"><font face="Times New Roman">INFO</font></span></strong><strong><span style="font-family: 宋体">）&#8221;&#8220;警告（</span><span lang="EN-US"><font face="Times New Roman">WARN</font></span></strong><strong><span style="font-family: 宋体">）&#8221;&#8220;错误（</span><span lang="EN-US"><font face="Times New Roman">ERROR</font></span></strong><strong><span style="font-family: 宋体">）&#8221;&#8220;致命错误（</span><span lang="EN-US"><font face="Times New Roman">FATAL</font></span></strong><strong><span style="font-family: 宋体">）&#8221;。</span></strong><span style="font-family: 宋体">为什么要把日志信息分成不同的级别呢？这实际上是方便我们更好的控制它。比如，通过</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span><span style="font-family: 宋体">的配置文件，我们可以设置&#8220;输出&#8216;调试&#8217;及以上级别的日志信息&#8221;（即&#8220;调试&#8221;&#8220;信息&#8221;&#8220;警告&#8221;&#8220;错误&#8221;&#8220;致命错误&#8221;），这对项目开发人员可能是有用的；我们还可以设置&#8220;输出&#8220;警告&#8221;及以上级别的日志信息&#8221;（即&#8220;警告&#8221;&#8220;错误&#8221;&#8220;致命错误&#8221;），这对项目最终用户可能是有用的。</span>&nbsp;<br />
<span lang="EN-US"><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体">仅从字面上理解，也可以大致得出结论：最常用的应该是</span><span lang="EN-US"><font face="Times New Roman">debug()</font></span><span style="font-family: 宋体">和</span><span lang="EN-US"><font face="Times New Roman">info()</font></span><span style="font-family: 宋体">；而</span><span lang="EN-US"><font face="Times New Roman">warn()</font></span><span style="font-family: 宋体">、</span><span lang="EN-US"><font face="Times New Roman">error()</font></span><span style="font-family: 宋体">、</span><span lang="EN-US"><font face="Times New Roman">fatal()</font></span><span style="font-family: 宋体">仅在相应事件发生后才使用。</span>&nbsp;<span lang="EN-US">&nbsp;</span> </p>
<p><span style="font-family: 宋体">从上面三个步骤可以看出，使用</span><span lang="EN-US"><font face="Times New Roman">commons-logging</font></span><span style="font-family: 宋体">的日志接口非常的简单，不需要记忆太多东西：仅仅用到了两个类</span><span lang="EN-US"><font face="Times New Roman">Log, LogFactory</font></span><span style="font-family: 宋体">，并且两个类的方法都非常少（后者只用到一个方法，前者经常用到的也只是上面第三步中列出的几个），同时参数又非常简单。</span> </p>
<p><span style="font-family: 宋体">上面所介绍的方法是目前被普通应用的，可以说是被标准化了的方法，几乎所有的人都是这么用。如果不信，或想确认一下，就去下载几个知名的</span><span lang="EN-US"><font face="Times New Roman">Java</font></span><span style="font-family: 宋体">开源项目源代码看一下吧。</span>&nbsp;<span lang="EN-US">&nbsp;</span> </p>
<p><span style="font-family: 宋体">下面给出一个完整的</span><span lang="EN-US"><font face="Times New Roman">Java</font></span><span style="font-family: 宋体">类的代码：</span>&nbsp;<br />
<span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman">package liigo.testlog;&nbsp;<br />
</font></span><strong><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman">import org.apache.commons.logging.Log; <br />
</font></span></strong><strong><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman">import org.apache.commons.logging.LogFactory;&nbsp;</font></span></strong> </p>
<p><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman">public class TestLog </font></span><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman">{&nbsp;<br />
</font></span><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp; </span><strong>private static Log log = LogFactory.getLog(TestLog.class);&nbsp;<br />
</strong></font></span><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp; </span>public void test()&nbsp;</font></span><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp; </span>{&nbsp;<br />
</font></span><strong><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>log.debug("111");&nbsp;<br />
</font></span></strong><strong><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>log.info("222");&nbsp;<br />
</font></span></strong><strong><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>log.warn("333");&nbsp;<br />
</font></span></strong><strong><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>log.error("444");&nbsp;<br />
</font></span></strong><strong><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>log.fatal("555");&nbsp;<br />
</font></span></strong><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp; </span>}&nbsp;</font></span><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%">&nbsp;</span> </p>
<p><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp; </span>public static void main(String[] args)&nbsp;</font></span><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp; </span>{&nbsp;<br />
</font></span><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>TestLog testLog = new TestLog();&nbsp;<br />
</font></span><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>testLog.test();&nbsp;<br />
</font></span><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp; </span>} <br />
</font></span><span lang="EN-US" style="background: rgb(217,217,217) 0% 50%"><font face="Times New Roman">}&nbsp;</font></span><span lang="EN-US">&nbsp;</span> </p>
<p><span style="font-family: 宋体">只要保证</span><span lang="EN-US"><font face="Times New Roman">commons-logging</font></span><span style="font-family: 宋体">的</span><span lang="EN-US"><font face="Times New Roman">jar</font></span><span style="font-family: 宋体">包在</span><span lang="EN-US"><font face="Times New Roman">classpath</font></span><span style="font-family: 宋体">中，上述代码肯定可以很顺利的编译通过。那它的执行结果是怎么样的呢？恐怕会有很大的不同，请继续往下看。</span>&nbsp;<span lang="EN-US">&nbsp;</span> </p>
<p><font size="1"><span lang="EN-US"><font face="Times New Roman">Log4j</font></span><span style="font-family: 宋体">在哪里呢？它发挥作用了吗？</span></font></p>
<p><span style="font-family: 宋体">应该注意到，我们上面给出的源代码，完全没有涉及到</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span><span style="font-family: 宋体">——这正是我们所希望的，这也正是</span><span lang="EN-US"><font face="Times New Roman">commons-logging</font></span><span style="font-family: 宋体">所要达到的目标之一。</span> </p>
<p><span style="font-family: 宋体">可是，怎么才能让</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span><span style="font-family: 宋体">发挥它的作用呢？答案很简单，只需满足&#8220;</span><span lang="EN-US"><font face="Times New Roman">classpath</font></span><span style="font-family: 宋体">中有</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span><span style="font-family: 宋体">的</span><span lang="EN-US"><font face="Times New Roman">jar</font></span><span style="font-family: 宋体">包&#8221;。前面已经说过了，</span><span lang="EN-US"><font face="Times New Roman">commons-logging</font></span><span style="font-family: 宋体">会自动发现并应用</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span><span style="font-family: 宋体">。所以只要它存在，它就发挥作用。（它不存在呢？自然就不发挥作用，</span><span lang="EN-US"><font face="Times New Roman">commons-logging</font></span><span style="font-family: 宋体">会另行选择其它的日志实现类。）</span></p>
<p><span style="font-family: 宋体">注意：配置文件</span><span lang="EN-US"><font face="Times New Roman">log4j.properties</font></span><span style="font-family: 宋体">对</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span><span style="font-family: 宋体">来说是必须的。如果</span><span lang="EN-US"><font face="Times New Roman">classpath</font></span><span style="font-family: 宋体">中没有该配置文件，或者配置不对，将会引发运行时异常。</span> </p>
<p><span lang="EN-US"><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体">这样，要正确地应用</span><span lang="EN-US"><font face="Times New Roman">Log4j</font></span><span style="font-family: 宋体">输出日志信息，</span><span lang="EN-US"><font face="Times New Roman">log4j.properties</font></span><span style="font-family: 宋体">的作用就很重要了。好在该文件有通用的模板，复制一份（稍加修改）就可以使用。几乎每一个</span><span lang="EN-US"><font face="Times New Roman">Java</font></span><span style="font-family: 宋体">项目目录内都会有一个</span><span lang="EN-US"><font face="Times New Roman">log4j.properties</font></span><span style="font-family: 宋体">文件，可下载几个</span><span lang="EN-US"><font face="Times New Roman">Java</font></span><span style="font-family: 宋体">开源项目源代码查看。本文最后也附一个模板性质的</span><span lang="EN-US"><font face="Times New Roman">log4j.properties</font></span><span style="font-family: 宋体">文件，直接复制过去就可以用，或者根据自己的需要稍加修改。后文将会</span><span lang="EN-US"><font face="Times New Roman">log4j.properties</font></span><span style="font-family: 宋体">文件适当作一些介绍。</span></p>
<span style="font-family: 宋体">
<h5 class="TextColor1" id="subjcns!5D716349F8F21164!271" style="margin-bottom: 0px">关于Log4j比较全面的配置</h5>
<div id="msgcns!5D716349F8F21164!271">
<div>
<p><span>LOG4J的配置之简单使它遍及于越来越多的应用中了：Log4J配置文件实现了输出到控制台、文件、</span> </p>
<p><span>回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。择其一二使用就够用了</span> </p>
<p><span>log4j.rootLogger=DEBUG,CONSOLE,A1,im <br />
log4j.addivity.org.apache=true&nbsp;</span>&nbsp;</p>
<p><span><font color="#0000ff">#&nbsp;应用于控制台</font> <br />
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender <br />
log4j.appender.Threshold=DEBUG <br />
log4j.appender.CONSOLE.Target=System.out <br />
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout <br />
log4j.appender.CONSOLE.layout.ConversionPattern=[framework]&nbsp;%d&nbsp;-&nbsp;%c&nbsp;-%-4r&nbsp;[%t]&nbsp;%-5p&nbsp;%c&nbsp;%x&nbsp;-&nbsp;%m%n <br />
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]&nbsp;n%c[CATEGORY]%n%m[MESSAGE]%n%n <br />
<br />
<font color="#0000ff">#应用于文件</font> <br />
log4j.appender.FILE=org.apache.log4j.FileAppender <br />
log4j.appender.FILE.File=file.log <br />
log4j.appender.FILE.Append=false <br />
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout <br />
log4j.appender.FILE.layout.ConversionPattern=[framework]&nbsp;%d&nbsp;-&nbsp;%c&nbsp;-%-4r&nbsp;[%t]&nbsp;%-5p&nbsp;%c&nbsp;%x&nbsp;-&nbsp;%m%n <br />
#&nbsp;Use&nbsp;this&nbsp;layout&nbsp;for&nbsp;LogFactor&nbsp;5&nbsp;analysis <br />
<br />
<br />
<font color="#0000ff">#&nbsp;应用于文件回滚</font> <br />
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender <br />
log4j.appender.ROLLING_FILE.Threshold=ERROR <br />
log4j.appender.ROLLING_FILE.File=rolling.log <br />
log4j.appender.ROLLING_FILE.Append=true <br />
log4j.appender.ROLLING_FILE.MaxFileSize=10KB <br />
log4j.appender.ROLLING_FILE.MaxBackupIndex=1 <br />
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout <br />
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework]&nbsp;%d&nbsp;-&nbsp;%c&nbsp;-%-4r&nbsp;[%t]&nbsp;%-5p&nbsp;%c&nbsp;%x&nbsp;-&nbsp;%m%n <br />
<br />
<font color="#0000ff">#应用于socket</font> <br />
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender <br />
log4j.appender.SOCKET.RemoteHost=localhost <br />
log4j.appender.SOCKET.Port=5001 <br />
log4j.appender.SOCKET.LocationInfo=true <br />
<font color="#0000ff">#&nbsp;Set&nbsp;up&nbsp;for&nbsp;Log&nbsp;Facter&nbsp;5</font> <br />
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout <br />
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n <br />
<br />
<br />
#&nbsp;Log&nbsp;Factor&nbsp;5&nbsp;Appender <br />
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender <br />
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 <br />
<br />
<font color="#0000ff">#&nbsp;发送日志给邮件</font> <br />
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender <br />
log4j.appender.MAIL.Threshold=FATAL <br />
log4j.appender.MAIL.BufferSize=10 <br />
log4j.appender.MAIL.From=web@www.wuset.com <br />
log4j.appender.MAIL.SMTPHost=www.wusetu.com <br />
log4j.appender.MAIL.Subject=Log4J&nbsp;Message <br />
log4j.appender.MAIL.To=web@www.wusetu.com <br />
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout <br />
log4j.appender.MAIL.layout.ConversionPattern=[framework]&nbsp;%d&nbsp;-&nbsp;%c&nbsp;-%-4r&nbsp;[%t]&nbsp;%-5p&nbsp;%c&nbsp;%x&nbsp;-&nbsp;%m%n <br />
<br />
<br />
<font color="#0000ff">#&nbsp;用于数据库</font> <br />
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender <br />
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test <br />
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver <br />
log4j.appender.DATABASE.user=root <br />
log4j.appender.DATABASE.password= <br />
log4j.appender.DATABASE.sql=INSERT&nbsp;INTO&nbsp;LOG4J&nbsp;(Message)&nbsp;VALUES&nbsp;('[framework]&nbsp;%d&nbsp;-&nbsp;%c&nbsp;-%-4r&nbsp;[%t]&nbsp;%-5p&nbsp;%c&nbsp;%x&nbsp;-&nbsp;%m%n') <br />
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout <br />
log4j.appender.DATABASE.layout.ConversionPattern=[framework]&nbsp;%d&nbsp;-&nbsp;%c&nbsp;-%-4r&nbsp;[%t]&nbsp;%-5p&nbsp;%c&nbsp;%x&nbsp;-&nbsp;%m%n <br />
<br />
<br />
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender <br />
log4j.appender.A1.File=SampleMessages.log4j <br />
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j' <br />
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout <br />
<br />
<font color="#0000ff">#自定义Appender </font><br />
log4j.appender.im&nbsp;=&nbsp;net.cybercorlin.util.logger.appender.IMAppender <br />
<br />
log4j.appender.im.host&nbsp;=&nbsp;mail.cybercorlin.net <br />
log4j.appender.im.username&nbsp;=&nbsp;username <br />
log4j.appender.im.password&nbsp;=&nbsp;password <br />
log4j.appender.im.recipient&nbsp;=&nbsp;corlin@cybercorlin.net <br />
<br />
log4j.appender.im.layout=org.apache.log4j.PatternLayout <br />
log4j.appender.im.layout.ConversionPattern&nbsp;=[framework]&nbsp;%d&nbsp;-&nbsp;%c&nbsp;-%-4r&nbsp;[%t]&nbsp;%-5p&nbsp;%c&nbsp;%x&nbsp;-&nbsp;%m%n</span></p>
</div>
</div>
</span><br />
<br />
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1545873</p>
<img src ="http://www.blogjava.net/PariScamper/aggbug/167232.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/PariScamper/" target="_blank">PariScamper</a> 2007-12-12 14:48 <a href="http://www.blogjava.net/PariScamper/archive/2007/12/12/167232.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用oracle的sequence像表中插入数据</title><link>http://www.blogjava.net/PariScamper/archive/2007/10/12/152447.html</link><dc:creator>PariScamper</dc:creator><author>PariScamper</author><pubDate>Fri, 12 Oct 2007 11:33:00 GMT</pubDate><guid>http://www.blogjava.net/PariScamper/archive/2007/10/12/152447.html</guid><wfw:comment>http://www.blogjava.net/PariScamper/comments/152447.html</wfw:comment><comments>http://www.blogjava.net/PariScamper/archive/2007/10/12/152447.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/PariScamper/comments/commentRss/152447.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/PariScamper/services/trackbacks/152447.html</trackback:ping><description><![CDATA[<p>SQL语句为<br />
insert into room(id,bid,name) values(room_seq.nextval,12,'1346S')；<br />
room_seq.nextval为取得room_seq的下一值后，取完值后会自动增长<br />
select room_seq.nextval from dual则选出room_seq的nextval值，取值后也会自动增长<br />
select room_seq.currval from dual则选出room_seq的当前值，取值后不会自动增长<br />
另外，Oracle不像其他数据库，NVARCHAR2的数据类型的取值居然是'abcd'（单引号），既不是双引号，也不是无引号。</p>
<img src ="http://www.blogjava.net/PariScamper/aggbug/152447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/PariScamper/" target="_blank">PariScamper</a> 2007-10-12 19:33 <a href="http://www.blogjava.net/PariScamper/archive/2007/10/12/152447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>