??xml version="1.0" encoding="utf-8" standalone="yes"?> (2)servlet范围内的参数Q只能在servlet的init()Ҏ中取得,在web.xml中配|如下: 在servlet中可以通过代码分别取用Q?/p>
W一U参数在servlet里面可以通过getServletContext().getInitParameter("context/param")得到
Commons-loggin的目的是?#8220;所有的Java日志实现”提供一个统一的接口,它自w的日志功能q_弱(只有一个简单的SimpleLog?Q,所以一般不会单独用它。Log4j的功能非常全面强大,是目前的首选。我发现几乎所有的Java开源项目都会用到Log4jQ但我同时发玎ͼ所有用到Log4j的项目一般也同时会用到commons-loggin。我惻I大家都不希望自己的项目与Log4jl定的太紧密吧。另外一个我能想到的“同时使用commons-logging和Log4j”的原因是Q简化用和配置?
二、Commons-logging能帮我们做什么?
提供一个统一的日志接口,单了操作Q同旉免项目与某个日志实现pȝ紧密的耦合Q很贴心的帮我们自动选择适当的日志实现系l?如log4j,JDK自n的日志实现类,SimpleLog)它甚至不需要配|?
说明如下Q?/span>
1) 首先在classpath下寻找自q配置文gcommons-logging.propertiesQ如果找刎ͼ则用其中定义的Log实现c;
2) 如果找不到commons-logging.properties文gQ则在查找是否已定义pȝ环境变量org.apache.commons.logging.LogQ找到则使用其定义的Log实现c;
建立一个叫 QCATALINA_OPTS 的环境变?
l他的?Q?- Dorg.apache.commons.logging.Log = org.apache.commons.logging.impl.SimpleLog - Dorg.apache.commons.logging.simplelog.defaultlog = warn
3) 否则Q查看classpath中是否有Log4j的包Q如果发玎ͼ则自动用Log4j作ؓ日志实现c;
4) 否则Q用JDK自n的日志实现类QJDK1.4以后才有日志实现c)Q?
5) 否则Q用commons-logging自己提供的一个简单的日志实现cSimpleLogQ?
Q以上顺序不保证完全准确Q请参考官Ҏ)
可见Qcommons-loggingL能找C个日志实现类Qƈ且尽可能扑ֈ一?#8220;最合?#8221;的日志实现类。我说它“很脓?#8221;实际上是因ؓQ?
1、可以不需要配|文Ӟ
2、自动判断有没有Log4j包,有则自动使用之;
3、最悲观的情况下也总能保证提供一个日志实玎ͼSimpleLogQ?
可以看到Qcommons-logging对编E者和Log4j都非常友好?
三、Commons-loggingl合Log4j
只需Log4j的Jar包和log4j.properties攄到classpash中就可以了。这样就很简单地完成了commons-logging与Log4j的融合。如果不想用Log4j了怎么办?只需classpath中的Log4j的Jar包删除即可。就q么单!
具体代码如下Q?/span>
应该注意刎ͼ我们上面l出的源代码Q完全没有涉及到Log4j——这正是我们所希望的,q也正是commons-logging所要达到的目标之一?
可是Q怎么才能让Log4j发挥它的作用呢?{案很简单,只需满“classpath中有Log4j的jar?#8221;。前面已l说q了Qcommons-logging会自动发现ƈ应用Log4j。所以只要它存在Q它发挥作用。(它不存在呢?自然׃发挥作用Qcommons-logging会另行选择其它的日志实现类。)
四、单独用Log4j
import org.apache.log4j.Logger;
2 import org.apache.log4j.PropertyConfigurator;
3 public class TestLog4j {
4 static Logger logger = Logger.getLogger(TestLog4j. class ); // First step
5 public static void main(String args[]) {
6 PropertyConfigurator.configure( " log4j.properties " ); // Second step
7 logger.debug( " Here is some DEBUG " ); // Third step
8 logger.info( " Here is some INFO " );
9 logger.warn( " Here is some WARN " );
10logger.error( " Here is some ERROR " );
11logger.fatal( " Here is some FATAL " );
12}
13}
ȝ
commons-logging和Log4j的jar包都攄到classpath下,同时也将Log4j的配|文件放到classpath中,两者就可以很好的合作?
采用Log4j配合commons-logging作ؓ日志pȝQ是目前Java领域非常非常行的模式,使用非常非常的普遍。两者的l合带来的结果就是:?+ 强大?
commons-logging提供了简捗统一的接口,不需要额外配|,单;
Log4j功能非常全面、强大;
commons-logging仅仅对Log4j(当然q包括其它LOG实现)作了一层包装,具体的日志输是在内部转交ln后的Log4j来处理;而Log4j虽然做了所有的事情Q却甘作l叶Q从不以真nCZh?
两者堪U绝配?
五、对log4j.properties的一点介l?
下面对log4j.properties文g内容作一点点介绍Q以后文所附log4j.properties文gZQ?
除去?开头的注释以及IQ第一行有用的内容是:
1 log4j.rootLogger = DEBUG, CONSOLE,A1
log4j.rootLogger是最最重要的一个属性了Q它定义日志信息?#8220;输出U别”?#8220;输出目的?#8221;?
关键?#8220;=”后面的|“DEBUG, CONSOLE,A1”q里我们要把它分成两部分Q第一个逗号之前的是W一部分Q指?#8220;输出U别”Q后面的是第二部分,指定“输出目的?#8221;。可以同时指定多?#8220;输出目的?#8221;Q以逗号隔开?
具体C面这一行:它指定的“输出U别”?#8220;DEBUG”Q它指定?#8220;输出目的?#8221;?#8220;CONSOLE”?#8220;A1”?
注意Q?
“输出U别”有可选的五个|分别是DEBUG、INFO、WARN、ERROR、FATALQ它们是由Log4jpȝ定义的?
“输出目的?#8221;是我们自己定义的了Q就在log4j.properties的后面部分,此文件定义的“输出目的?#8221;有CONSOLE、FILE、ROLLING_FILE、SOCKET、LF5_APPENDER、MAIL、DATABASE、A1、im。该文g之所以可作主模板Q就是因为它比较全面地定义了各种常见的输出目的地Q控制台、文件、电子邮件、数据库{)?
好,下面详细解释“log4j.rootLogger=DEBUG, CONSOLE,A1”q一行:
指定“输出U别”?#8220;DEBUG”Q即Q仅输出U别大于{于“调试QDEBUGQ?#8221;的日志信息。如果此处指定的?#8220;WARN”则仅调用warn()、error()、fatal()Ҏ输出的日志信息才被输出到“输出目的?#8221;Q而调用debug()、info()Ҏ输出的日志信息不被输出到“输出目的?#8221;。明白了吗?Log4j是以这U方式来qo控制日志信息的输Z否,q也是对日志信息q行U别分类的目的?
指定“输出目的?#8221;?#8220;CONSOLE”?#8220;A1”Q即Q将指定的日志信息(Ҏ日志U别已进行了qoQ同时输出到?#8220;控制?#8221;?#8220;SampleMessages.log4j文g”?
Z么说“CONSOLE”表示日志信息输出到“控制?#8221;呢?那就要看一下后文的定义了:
# 应用于控制台
1 log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender
2 log4j.appender.Threshold = DEBUG
3 log4j.appender.CONSOLE.Target = System.out
4 log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
5 log4j.appender.CONSOLE.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n
6 #log4j.appender.CONSOLE.layout.ConversionPattern = [start] % d {DATE} [DATE] % n % p[PRIORITY] % n % x[NDC] % n % t[THREAD] n % c[CATEGORY] % n % m[MESSAGE] % n % n
Z么说“A1”表示日志信息输出到“SampleMessages.log4j文g”呢?q要看后文的定义Q?
1 log4j.appender.A1 = org.apache.log4j.DailyRollingFileAppender
2 log4j.appender.A1.File = SampleMessages.log4j
3 log4j.appender.A1.DatePattern = yyyyMMdd - HH ' .log4j '
4 log4j.appender.A1.layout = org.apache.log4j.xml.XMLLayout
注意Q这里的定义没有指定输出文g的\径,它的路径实际上是 java.user.path的倹{?
您应该已l注意到Q在定义“输出目的?#8221;Ӟq可以指定日志格式、时间、布局{相关信息。略q?
好了Q我可以Ҏ需要,这一行修改ؓQ?
1 log4j.rootLogger = ERROR, CONSOLE,FILE,MAIL
?#8220;错误QERRORQ?#8221;?#8220;致命错误QFATALQ?#8221;U别的日志信息同时输出到控制台、文Ӟq且发电子邮件向pȝ理员报告。是不是很爽Q(如果?#8220;调试QDEBUGQ?#8221;U别的日志信息邮件给理员,恐怕迟早会把他/她的邮箱涨爆Q哪怕用的是GmailQ再ơ理解了“日志信息分Z同?#8221;的意图了吧?Q?
附:一个有用的log4j.properties文g模板
##Log4J的配|之单它遍及于来多的应用中?
##Log4J配置文g实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签{全套功能。择其一二用就够用了?
##此文Ӟlog4j.propertiesQ内Ҏ自网l,非本文作者liigo原创?
log4j.rootLogger = DEBUG, CONSOLE,A1
log4j.addivity.org.apache = true
# 应用于控制台
log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender
log4j.appender.Threshold = DEBUG
log4j.appender.CONSOLE.Target = System.out
log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n
#log4j.appender.CONSOLE.layout.ConversionPattern = [start] % d {DATE} [DATE] % n % p[PRIORITY] % n % x[NDC] % n % t[THREAD] n % c[CATEGORY] % n % m[MESSAGE] % n % n
#应用于文?
log4j.appender.FILE = org.apache.log4j.FileAppender
log4j.appender.FILE.File = file.log
log4j.appender.FILE.Append = false
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n
# Use this layout for LogFactor 5 analysis
# 应用于文件回?
log4j.appender.ROLLING_FILE = org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold = ERROR
log4j.appender.ROLLING_FILE.File = rolling.log
log4j.appender.ROLLING_FILE.Append = true
log4j.appender.ROLLING_FILE.MaxFileSize = 10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex = 1
log4j.appender.ROLLING_FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n
#应用于socket
log4j.appender.SOCKET = org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost = localhost
log4j.appender.SOCKET.Port = 5001
log4j.appender.SOCKET.LocationInfo = true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout = org.apache.log4j.PatternLayout
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
# Log Factor 5 Appender
log4j.appender.LF5_APPENDER = org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords = 2000
# 发送日志给邮g
log4j.appender.MAIL = org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold = FATA
log4j.appender.MAIL.BufferSize = 10
log4j.appender.MAIL.From = web@www.wuset.com
log4j.appender.MAIL.SMTPHost = www.wusetu.com
log4j.appender.MAIL.Subject = Log4J Message
log4j.appender.MAIL.To = web@www.wusetu.com
log4j.appender.MAIL.layout = org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n
# 用于数据?
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 LOG4J (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
log4j.appender.A1 = org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File = SampleMessages.log4j
log4j.appender.A1.DatePattern = yyyyMMdd - HH ' .log4j '
log4j.appender.A1.layout = org.apache.log4j.xml.XMLLayout
#自定义Appender
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net
log4j.appender.im.layout = org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n
# l束
Log4J发日志邮件给多个接收者及标题、正文ؕ码问?
以前开发的pȝ没有单独的日志管理,所有的日志l一输出到tomcat后台一个文仉Q不几天是好几GQ现在要整体增加一个Log4J理日志的功能,其实q方面的资料|上多的是。发邮g的配|说明也有,但是具体怎么发,q问题怎么解决那就比较了?
利用javamail发送邮Ӟ你需要导入包mail.jar和activation.jarq两个包 Q否则是没法发邮件的 Q下辚w|文仉l色行显C的是发给两个接收者ac和ae?
q里会出C文ؕ码问题,主要有两斚w的ؕ码,一是标题ؕ码;二是正文q。下边具体说明这两种q的解x案?
一?标题q
Log4J日志邮g的标题在配置文glog4j.properties里设定,如下
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=ab@163.com
log4j.appender.MAIL.SMTPHost=smtp@163.com
log4j.appender.MAIL.Subject= Log4J提醒您:pȝ发生了严重错?log4j.appender.MAIL.To=ac@163.com,ae@163.com
log4j.appender.MAIL.layout=com.sun.DefineLayOut
log4j.appender.MAIL.layout.LocationInfo=true
l色的行是标题Qlog4J配置文g默认的读取方式是ISO-88591Q遇C文会出现qQ我们可以把q个配置文glog4j.properties用jdk的工具native2asii转换一下编码方式?
命oQnative2asii log4j.properties log4jxx.properties
把这个log4jxx.properties改名为log4j.properties取代原来的log4j.propertiesok了?
灰色行重新编码后是:
log4j.appender.MAIL.Subject=Log4J\u63d0\u9192\u60a8\uff1a\u7cfb\u7edf\u53d1\u751f\u4e86\u4e25\u91cd\u9519\u8bef
二?正文q
正文qQ解决也比较单。阅读Log4J的源码类SMTPAppenderQ我们可以发现sendBuffer()Ҏ中有q样一句:
part.setContent(sbuf.toString(), layout.getContentType());
我们l箋q踪发现layout是配置文g里的layout属性对应的布局模式。但是这些布局模式都是l承自LayoutQ而contentType是只可通过getContentTypeҎ取得Q不能修攏V所有的布局模式getContentTypeҎq回的都?#8221;text/plain”Q?
为处理中文ؕ码,我们可以写一个布局模式。如果你要用HTMLLayoutQ我们就写一个HTMLLayout的子c,覆盖HTMLLayout的getContentTypeҎ卛_。假如我要用org.apache.log4j.HTMLLayout。我们就可以写一个DefineLayOutc,代码如下Q?
package com.sun;
import org.apache.log4j.HTMLLayout;
public class DefineLayOut extends HTMLLayout{
public String getContentType() {
return "text/html;charset=GBK";
}
}
对应的配|文件设|如U色行所C?
]]>
<context-param>
<param-name>context/param</param-name>
<param-value>avalible during application</param-value>
</context-param>
<servlet>
<servlet-name>MainServlet</servlet-name>
<servlet-class>com.wes.controller.MainServlet</servlet-class>
<init-param>
<param-name>param1</param-name>
<param-value>avalible in servlet init()</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
package com.wes.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
public class MainServlet extends HttpServlet ...{
public MainServlet() ...{
super();
}
public void init() throws ServletException ...{
System.out.println("下面的两个参数param1是在servlet中存攄");
System.out.println(this.getInitParameter("param1"));
System.out.println("下面的参数是存放在servletcontext中的");
System.out.println(getServletContext().getInitParameter("context/param"));
}
}
W二U参数只能在servlet的init()Ҏ中通过this.getInitParameter("param1")取得
]]>
]]>
<set-property property="contextConfigLocation"
value="classpath*:spring/*.xml"/>
</plug-in>
q样子的话Strutsp调用由Spring生成的ActioncR?br>
但是
如果写成Q?br><plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"/>
则是默认配置文g为在WEB-INF下的action-servlet.xml文gQ可在action-servlet.xml中再截入各个action bean的配|,如下是一个action-servlet.xml的例子:
2 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
3 <beans default-autowire="byName" default-lazy-init="true">
4 <!-- 后台理模块 -->
5 <import resource="modules/spring-config-admin.xml"/>
6 <!-- 书店前台模块 -->
7 <import resource="modules/spring-config-shop.xml"/>
8 </beans>
9
]]>
]]>
]]>
在文件夹加上{21EC2020-3AEA-1069-A2DD-08002B30309D}q个后缀
例如Q游?{21EC2020-3AEA-1069-A2DD-08002B30309D},之后随便怎么炚w只能q入控制面板Q?br>修改后图标也变成控制面板一样了!!
要改回只要用winrar扑ֈq个文g夹,L{21EC2020-3AEA-1069-A2DD-08002B30309D}q个后缀卛_。这招连搜烦都找不到改过后文件夹中的东西,另一个方?可以q行cmd 通过dir扑ֈ所在位|?可看到此时文件夹名及其后~再输?ren (原文件夹? (新文件夹? OK了?/p>
Ҏ二:
W一步,?#8220;开?q行”Q键?#8220;cmd”Q打开命o提示W;
W二步,创徏你所要加密的文g夏V如在E盘根目录下创建abc文g夹,键入以下内容QMD E:\abc..\ 后,回RQ?
W三步,在E盘根目录下的abc.文g夹上双击Q你会发现根本打不开Qƈ会弹出如下图的提C,当然q就是我们想要的?Q?Q;
W四步,?#8220;开?q行”Q键?#8220;E:\abc..\”Q再?#8220;定”Q怎么P是不是打开了?Q这时候你可以把你要放入E:\abc..\文g多w的文件粘贴进d可!通过1~4步,已经完成加密q程?
W五步,删除E:\abc..\文g夏V点“开?q行”Q键?#8220;cmd”Q打开命o提示W,键入RD E:\abc..\ 卛_删除Q注Q如果E:\abc..\ 文g多w有文Ӟ则无法删除,请回到第四步删除里面所有文件后q行W五步步骤方可删除!如下图:
W六步,Z不让览者不感觉到这是空的文件夹Q可以粘贴一些无关紧要的文gq去qh讉K者!
以上只是在用电脑过E中的一点小l验Q现在共享出来,或许能给大家一些帮助!
注意Q此法只是一个简易加密法Q懂得DOS知识的或知道此法的可以轻易破解打开Q因此,此法只适用一般需要加密的文gQ不适用重要文g的加密!