生成javadoc时 thorws 和java throw exceptionn 的区别

根据Session区分的日志系统. -
- ITeye博客
前一阵,被经理安排了个任务,,就是在现有项目中加入日志,但是要根据Session的值来区分日志文件.用LOG4J实现不了..哎 怒了...自己重写了一个....
1,按这个分公司编号创建文件夹
2,按部门号+日期创建LOG文件
3,当日志文件大于指定SIZE时拷贝文件
各位多提一提意见,,, 本人技术有限, 有些地方的可能存在错误,我想不到的! 请各位指正啊!!
Log.java
package org.dhcc.fm.
import java.text.SimpleDateF
import java.util.D
import javax.servlet.http.HttpS
* @author lishengxi
public class Log
private LogFile tf =
public Log(HttpSession session){
tf = new LogFile(session);
public String logForMat(){
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日-HH点mm分ss秒");
String newDate = format.format(new Date());
return newDate+",发生错误:";
public void error(String mss){
tf.write(logForMat()+mss);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
public void error(String mss,Exception et){
tf.write(logForMat()+mss,et);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
LogFactory.java
package org.dhcc.fm.
import javax.servlet.http.HttpS
* 日志工厂类
* @author lishengxi
public class LogFactory {
public static Log createLog(HttpSession session){
Log log = new Log(session);
LogFile.java
package org.dhcc.fm.
import java.io.F
import java.io.FileOutputS
import java.io.FileW
import java.io.OutputS
import java.io.OutputStreamW
import java.io.PrintW
import java.text.SimpleDateF
import java.util.D
import javax.servlet.http.HttpS
* 日志文件操作类
* @author lishengxi
public class LogFile {
private static String logpath = LogProperties.LOG_FM_FILE_PATH;
private static String fileH = LogProperties.LOG_FM_FILE_TYPE;
private static long length = LogProperties.LOG_FM_FILE_SIZE;
private static String department = LogProperties.LOG_FM_SESSION_DEPARTMENT;
private static String upbrno = LogProperties.LOG_FM_SESSION_UPBRNO;
private static String encoding = LogProperties.LOG_FM_FILE_ENCODING;
private String _fileN
private String up_br_
public String getUp_br_no() {
return up_br_
public void setUp_br_no(String upBrNo) {
up_br_no = upBrNo;
public LogFile(HttpSession session){
String temp = session.getAttribute(department).toString();
if(temp!=null&&!temp.equals("")){
_fileName =
up_br_no =
session.getAttribute(upbrno).toString();
newFolder();
newFile();
public void newFolder(){
String filePath = logpath+"\\"+getUp_br_no();
filePath = filePath.toString();
File myFilePath = new File(filePath);
if(!myFilePath.exists()){
myFilePath.mkdir();
catch(Exception e)
e.printStackTrace();
public void newFile(){
String filePath = logpath+"\\"+getUp_br_no()+"\\"+getLogFile(_fileName)+fileH;
File myFilePath = new File(filePath);
if (!myFilePath.exists()){
myFilePath.createNewFile();
catch (Exception e){
e.printStackTrace();
public void rollOver() {
File myFilePath = new File(logpath+"\\"+getUp_br_no()+"\\"+getLogFile(_fileName)+fileH);
File target = new File(logpath+"\\"+getUp_br_no()+"\\"+getTLogFile(_fileName)+fileH);
if(myFilePath.length()&length){
myFilePath.renameTo(target);
public void write(String str,Exception e) throws Exception{
this.rollOver();
File myFilePath = new File(logpath+"\\"+getUp_br_no()+"\\"+getLogFile(_fileName)+fileH);
FileOutputStream fos = new FileOutputStream(myFilePath,true);
OutputStreamWriter osw = new OutputStreamWriter(fos,encoding);
PrintWriter myFile = new PrintWriter(osw);
myFile.println(str);
e.printStackTrace(myFile);
myFile.close();
osw.close();
fos.close();
public void write(String str) throws Exception{
this.rollOver();
File myFilePath = new File(logpath+"\\"+getUp_br_no()+"\\"+getLogFile(_fileName)+fileH);
FileOutputStream fos = new FileOutputStream(myFilePath,true);
OutputStreamWriter osw = new OutputStreamWriter(fos,encoding);
PrintWriter myFile = new PrintWriter(osw);
myFile.println(str);
myFile.close();
osw.close();
fos.close();
private String getLogFile(String fileName){
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日");
return fileName+"_"+format.format(new Date());
private String getTLogFile(String fileName){
SimpleDateFormat format = new SimpleDateFormat("HH点mm分ss秒");
return getLogFile(fileName)+"_"+format.format(new Date());
LogProperties.java
package org.dhcc.fm.
import java.io.IOE
import java.io.InputS
import java.util.P
* 日志属性类
* @author lishengxi
public class LogProperties {
private static final String LOGFILE = "LOG.properties"; //默认日志配置文件
public static String LOG_FM_FILE_PATH = "";//日志保存路径
public static String LOG_FM_FILE_TYPE = "";//日志文件类型
public static String LOG_FM_FILE_ENCODING = "";//日志文件编码
public static long LOG_FM_FILE_SIZE = 0;//日志文件大小
public static String LOG_FM_SESSION_DEPARTMENT = "";//部门
public static String LOG_FM_SESSION_UPBRNO = "";//机构
//获取ClassPath下的日志配置文件
InputStream is1 = Thread.currentThread().getContextClassLoader().getResourceAsStream(LOGFILE);
Properties p = new Properties();
p.load(is1);
LOG_FM_FILE_PATH = p.getProperty("log.fm.file.path");
LOG_FM_FILE_TYPE = p.getProperty("log.fm.file.type");
LOG_FM_FILE_SIZE = LogUtil.toFileSize(p.getProperty("log.fm.file.size"),1024);
LOG_FM_FILE_ENCODING = p.getProperty("log.fm.file.type.encoding");
LOG_FM_SESSION_DEPARTMENT = p.getProperty("log.fm.session.department");
LOG_FM_SESSION_UPBRNO = p.getProperty("log.fm.session.upbrno");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
LogUtil.java
package org.dhcc.fm.
* 日志工具类
* @author lishengxi
public class LogUtil {
* 转换文件大小
* @param value
* @param dEfault
public static long toFileSize(String value, long dEfault) {
if(value == null)
String s = value.trim().toUpperCase();
long multiplier = 1;
if((index = s.indexOf("KB")) != -1) {
multiplier = 1024;
s = s.substring(0, index);
else if((index = s.indexOf("MB")) != -1) {
multiplier = ;
s = s.substring(0, index);
else if((index = s.indexOf("GB")) != -1) {
multiplier = 24;
s = s.substring(0, index);
if(s != null) {
return Long.valueOf(s).longValue() *
catch (NumberFormatException e) {
e.printStackTrace();
测试一下啊...!!!!!!!!
package org.dhcc.fm.
import java.util.E
import java.util.HashM
import javax.servlet.ServletC
import javax.servlet.http.HttpS
import javax.servlet.http.HttpSessionC
import org.dhcc.fm.log.*;
public class Test extends Thread {
private String TName = "";
public Test(String N){
TName = N;
public void run() {
// TODO Auto-generated method stub
HttpSession session = new HttpSession() {
HashMap sessionSop = new HashMap();
public void setMaxInactiveInterval(int arg0) {
// TODO Auto-generated method stub
public void setAttribute(String arg0, Object arg1) {
// TODO Auto-generated method stub
sessionSop.put(arg0, arg1);
public void removeValue(String arg0) {
// TODO Auto-generated method stub
public void removeAttribute(String arg0) {
// TODO Auto-generated method stub
public void putValue(String arg0, Object arg1) {
// TODO Auto-generated method stub
public boolean isNew() {
// TODO Auto-generated method stub
public void invalidate() {
// TODO Auto-generated method stub
public String[] getValueNames() {
// TODO Auto-generated method stub
public Object getValue(String arg0) {
// TODO Auto-generated method stub
public HttpSessionContext getSessionContext() {
// TODO Auto-generated method stub
public ServletContext getServletContext() {
// TODO Auto-generated method stub
public int getMaxInactiveInterval() {
// TODO Auto-generated method stub
public long getLastAccessedTime() {
// TODO Auto-generated method stub
public String getId() {
// TODO Auto-generated method stub
public long getCreationTime() {
// TODO Auto-generated method stub
public Enumeration getAttributeNames() {
// TODO Auto-generated method stub
public Object getAttribute(String arg0) {
// TODO Auto-generated method stub
return sessionSop.get(arg0);
session.setAttribute("department_name", "三星企划事业部");
session.setAttribute("up_br_no", "010002");
Log log = LogFactory.createLog(session);
for(int i = 0 ; i & 10000 ; i ++){
thorwsOut();
} catch (Exception e) {
// TODO Auto-generated catch block
log.error("数据库连接错误!",e);
e.printStackTrace();
public void thorwsOut() throws Exception{
throw new Exception("数据连接格式不正确!..");
public static void main(String agrs[]){
new Test("线程1").start();
System.out.println("1--------");
new Test("线程2").start();
System.out.println("2--------");
new Test("线程3").start();
System.out.println("3--------");
忘了,要加入LOG.properties
log.fm.file.path = c:\\fm_log\\
log.fm.file.type = .log
log.fm.file.size = 1MB
log.fm.file.type.encoding = UTF-8
log.fm.session.department = department_name
log.fm.session.upbrno = up_br_no
下载次数: 148
论坛回复 /
(10 / 5228)
mercyblitz 写道建立一个HttpSessionAttributeListener,当属性被添加时,根据一定的模式添加Appender,就OK啦。
3Q,有一点点思路了!!! 本来以为LOG4J 实现不了..&& 再自己扩展一下log4j的file appender应该就可以了,需求的3,log4j已经实现了,只需要自己做1,2就可以了。
建立一个HttpSessionAttributeListener,当属性被添加时,根据一定的模式添加Appender,就OK啦。
3Q,有一点点思路了!!! 本来以为LOG4J 实现不了..&&
贴一下我以前的代码吧,我自己创建了一个DeviceLogger扩展了log4j的logger, 然后写了一个DeviceFileAppender。 DeviceFileAppender里面维护了一个Map,用来完成手机号跟相应的FileAppender之间的映射。 不过你的实现要考虑session失效的时候把相应的FileAppender从Map删掉,要不最终会OutOfMemory。
public class DeviceLogger extends Logger {
The fully qualified name of the Logger class. See also the
getFQCN method. */
private static final String FQCN = DeviceLogger.class.getName() + ".";
* In log4j.properties, this logger should be configured to an appender &code&DeviceFileAppender&/code&
public static final String PARENT_LOGGER_NAME = "com.smartomcx.logging.device.";
private static DeviceLoggerFactory factory = new DeviceLoggerFactory();
protected DeviceLogger(String name) {
super(name);
this.imei = name.substring(PARENT_LOGGER_NAME.length());
public String getImei() {
public static DeviceLogger getDeviceLogger(String imei) {
return (DeviceLogger)Logger.getLogger(PARENT_LOGGER_NAME + imei, factory);
public class DeviceLoggerFactory implements LoggerFactory {
public Logger makeNewLoggerInstance(String imei) {
return new DeviceLogger(imei);
* This appender appends the log of &code&DeviceLogger&/code& to a separate file for each IMEI.
* Under parent folder, each imei will have a subfolder, and the log for each IMEI will be output
* to device.log under each specific folder
public class DeviceFileAppender extends AppenderSkeleton {
private ConcurrentMap&String, FileAppender& appenders = new ConcurrentHashMap&String, FileAppender&();
/** Controls file truncatation. The default value for this variable
* is &code&true&/code&, meaning that by default a
* &code&FileAppender&/code& will append to an existing file and not
* truncate it.
* &p&This option is meaningful only if the FileAppender opens the
protected boolean fileAppend =
The name of the parent folder. */
protected String parentFolder =
Do we do bufferedIO? */
protected boolean bufferedIO =
* Determines the size of IO buffer be. Default is 8K.
protected int bufferSize = 8*1024;
public DeviceFileAppender() {
public boolean isFileAppend() {
return fileA
public void setFileAppend(boolean fileAppend) {
this.fileAppend = fileA
public String getParentFolder() {
return parentF
* This is the parent folder for all devices
* @param parentFolder
public void setParentFolder(String parentFolder) {
this.parentFolder = parentFolder.trim();
if(this.parentFolder.endsWith(System.getProperty("file.separator") )) { //the folder name should not contain '/' at end
this.parentFolder = this.parentFolder.substring(0, this.parentFolder.length() - 1);
public boolean isBufferedIO() {
return bufferedIO;
public void setBufferedIO(boolean bufferedIO) {
this.bufferedIO = bufferedIO;
public int getBufferSize() {
return bufferS
public void setBufferSize(int bufferSize) {
this.bufferSize = bufferS
/* (non-Javadoc)
* @see org.apache.log4j.AppenderSkeleton#append(org.apache.log4j.spi.LoggingEvent)
protected void append(LoggingEvent event) {
Category category = event.getLogger();
if(!(category instanceof DeviceLogger)) { //only append DeviceLogger
DeviceLogger logger = (DeviceLogger)
FileAppender appender =
appender = getFileAppender(logger.getImei());
} catch (IOException e) {
e.printStackTrace();
appender.append(event);
* Get the FileAppender based on the imei
* @param imei
* @throws IOException
protected synchronized FileAppender getFileAppender(String imei) throws IOException {
FileAppender appender = this.appenders.get(imei);
if(appender != null) {
String imeiFolderPath = getImeiFolderPath(imei);
File imeiFolder = new File(imeiFolderPath);
deleteImeiFolderIfNotDirectory(imeiFolder);
createImeiFolderIfNotExist(imeiFolder);
String logFilePath = getLogFilePath(imeiFolderPath);
appender = new FileAppender(getLayout(), logFilePath, this.isFileAppend(), this.isBufferedIO(), this.getBufferSize());
this.appenders.put(imei, appender);
* Get the log file path under the IMEI folder
* @param imeiFolderPath
protected String getLogFilePath(String imeiFolderPath) {
String logFilePath = imeiFolderPath + System.getProperty("file.separator") + "device.log";
return logFileP
* Get the IMEI folder path for a imei
* @param imei
protected String getImeiFolderPath(String imei) {
String imeiFolderPath = this.parentFolder + System.getProperty("file.separator") +
return imeiFolderP
protected void deleteImeiFolderIfNotDirectory(File imeiFolder) {
if(imeiFolder.exists() && !imeiFolder.isDirectory()) {
imeiFolder.delete();
private void createImeiFolderIfNotExist(File imeiFolder) {
if(! imeiFolder.exists()) {
imeiFolder.mkdir();
/* (non-Javadoc)
* @see org.apache.log4j.Appender#close()
public void close() {
closeAllAppenders();
private void closeAllAppenders() {
Set&Entry&String, FileAppender&& entries = this.appenders.entrySet();
for(Entry&String, FileAppender& entry : entries) {
entry.getValue().close();
private void reset() {
this.appenders.clear();
/* (non-Javadoc)
* @see org.apache.log4j.Appender#requiresLayout()
public boolean requiresLayout() {
对啊,,& 难道销毁 要写成 监听 然后 把 那个MAP 改成static??
我觉得你扩展一个log4j的Appender就可以了,曾经有个类似的需求,每个手机号生成不同的log文件到每个手机号自己的目录
恩 ,我尝试过... 重新实现一个Appender ,,关键是 如何把session 给传进去呢?&&&
浏览: 915 次
来自: 北京
&div class=&quote_title ...
这个可能设计者有考虑用接口拼一些HTML,而HTML里面可能有 ...
MySSH 写道EL表达式不会出什么问题的~~看看你们的设计问 ...
wad12302 写道request 传进去主要用来处理什么? ...
kjj 写道你不觉得设计这个的人不适合做设计吗,传reques ...用户名:winters1224
文章数:217
评论数:14
访问量:97330
注册日期:
阅读量:1297
阅读量:3317
阅读量:435789
阅读量:1123142
[匿名]51cto游客:
51CTO推荐博文
今天用ant生成javadoc时,出了两个小问题。以下是最后完成版的build.xml。红色字体部分是与这两个问题相关的:&?xml version="1.0" encoding="UTF-8" standalone="no"?&&project name="fundation" default="2-javadoc" basedir="."&&&& &!-- 定义属性 --&&&& &property name="dir.javadoc" value="javadocs" /&&&& &property name="src.java" value="src" /&&&& &!-- 完整的classpath --&&&& &path id="full-classpath"&&&& &&& &fileset file="lib/*.jar" /&&&& &&& &pathelement path="bin" /&&&&&&&& &!-- 三个外部jar包--&& && && &pathelement path="D:/bea/jrockit_160_14_R27.6.5-32/lib/tools.jar" /&&&& & & &pathelement&&& &&& &&& path="D:/Program Files/eclipse/plugins/org.junit_4.8.2.v4_8_2_v5/junit.jar" /&&&& &&& &pathelement&&& &&& &&& path="D:/Program Files/eclipse/plugins/org.hamcrest.core_1.1.0.v00.jar" /&&&& &/path&&&& &!-- 第一步,初始化 --&&&& &target name="1-init"&&&& &&& &delete dir="${dir.javadoc}" /&&&& &&& &mkdir dir="${dir.javadoc}" /&&&& &/target&&&& &!-- 第二步,生成文档 --&&&& &!-- 注意编码格式 --&&&& &target name="2-javadoc" depends="1-init"&&&& &&& &javadoc destdir="${dir.javadoc}" windowtitle="ATIP Project Class Library"&&& &&& &&& use="yes" linksource="true" splitindex="yes" encoding="UTF-8"&&& &&& &&& docencoding="GBK"&&&& &&& &&& &classpath refid="full-classpath" /&&&& &&& &&& &packageset dir="${src.java}" defaultexcludes="yes"&&&& &&& &&& &/packageset&&&& &&& &/javadoc&&&& &/target&&/project&先看&!-- 三个外部jar包--&这个地方。如果不把这三个jar包引入classpath中,将出现这个问题:[javadoc] java.lang.ClassCastException: com.sun.tools.javadoc.ClassDocImpl cannot be cast to com.sun.javadoc.AnnotationTypeDoc上网查过之后发现,这个问题的原因是工程中引用了第三方jar包,而ant所用的classpath中没有相关定义。参见/questions/44853/why-am-i-getting-a-classcastexception-when-generating-javadocs解决方法一目了然,把用到的第三方jar包引进来就行了。关于这个问题,也有说法是把jdk下的lib/tools.jar引入ant的classpath中。我试了,没能解决这个问题。再看&!-- 注意编码格式 --&和后面的编码格式定义。我的工程用的是UTF-8编码,但是如果我把编码、解码格式都定义为UTF-8,还是会出现乱码。我不知道原因。现有的这个配置是我枚举了编码、解码和GBK、UTF-8的可能组合之后找到的可行方案。用这个配置创建的javadoc文档没有再出现乱码。本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)PHP开发框架
开发工具/编程工具
服务器环境

我要回帖

更多关于 javadoc exception 的文章

 

随机推荐