log4j的基本使用和参数设定
1、简介
2、核心组件
2.1 Logger
| ALL | 打开所有日志 |
| DEBUG | 细粒度信息事件,对调试应用程序是非常有帮助的 |
| INFO | 粗粒度信息事件,突出强调应用程序的运行过程 |
| WARN | 可能出现潜在错误的情形 |
| ERROR | 虽然发生错误事件,但仍然不影响系统的继续运行 |
| FATAL | 指出每个严重的错误事件将会导致应用程序的退出 |
| OFF | 关闭所有日志 |
static Logger logger = Logger.getLogger(test.class);
static Logger logger = Logger.getLogger(test.class);
logger.setLevel((Level)Level.WARN);
logger.setLevel((Level)Level.WARN);
2.2 Appender
| ConsoleAppender | 使用用户指定的布局(layout)输出日志事件到System.out或者 System.err。默认的目标是System.out |
| FileAppender | 把日志事件写入一个文件 |
| DailyRollingFileAppender | 扩展FileAppender,因此多个日志文件可以以一个用户选定的频率进行循环日志记录 |
| RollingFileAppender | 扩展FileAppender,备份容量达到一定大小的日志文件 |
| WriterAppender | 根据用户的选择把日志事件写入到Writer或者OutputStream |
| SMTPAppender | 当特定的日志事件发生时,一般是指发生错误或者重大错误时,发送一封邮件 |
| SocketAppender | 给远程日志服务器(通常是网络套接字节点)发送日志事件(LoggingEvent)对象 |
| SocketHubAppender | 给远程日志服务器群组(通常是网络套接字节点)发送日志事件(LoggingEvent)对象 |
| SyslogAppender | 给远程异步日志记录的后台精灵程序(daemon)发送消息 |
| TelnetAppender | 一个专用于向只读网络套接字发送消息的log4j appender |
2.3 Layout
| HTMLLayout | 格式化日志输出为HTML表格 |
| PatternLayout | 根据指定的转换模式格式化日志输出,或者如果没有指定任何转换模式,就使用默认的转换模式 |
| SimpleLayout | 以一种非常简单的方式格式化日志输出,它打印级别 Level,然后跟着一个破折号“-“ ,最后才是日志消息 |
3、配置文件的设置
3.1 根 Logger
log4j.rootLogger = [ level ] , appenderName, appenderName, ...
log4j.rootLogger = [ level ] , appenderName, appenderName, ...
- level 优先级,ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
- appenderName 指定日志信息输出到哪个地方。您可以同时指定多个输出目的地
3.2 某个包或类的 Logger
log4j.logger.xxx.xxx.xxx=level
log4j.logger.xxx.xxx.xxx=level
log4j.rootLogger=WARN,A
log4j.logger.com.opensymphony.xwork2.interceptor.TimerInterceptor=DEBUG
log4j.appender.A=org.apache.log4j.ConsoleAppender
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern==%-d{yyyy-MM-dd HH:mm:ss} [%p]-[%c] %m%n
log4j.rootLogger=WARN,A
log4j.logger.com.opensymphony.xwork2.interceptor.TimerInterceptor=DEBUG
log4j.appender.A=org.apache.log4j.ConsoleAppender
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern==%-d{yyyy-MM-dd HH:mm:ss} [%p]-[%c] %m%n
log.info("微信accessToken刷新 " + WechatAPI.getAccessToken());
log.info("微信accessToken刷新 " + WechatAPI.getAccessToken());
log4j.rootLogger=WARN,A
log4j.logger.indiv.dulk=DEBUG
log4j.logger.com.opensymphony.xwork2.interceptor.TimerInterceptor=DEBUG
log4j.appender.A=org.apache.log4j.ConsoleAppender
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern==%-d{yyyy-MM-dd HH:mm:ss} [%p]-[%c] %m%n
log4j.rootLogger=WARN,A
log4j.logger.indiv.dulk=DEBUG
log4j.logger.com.opensymphony.xwork2.interceptor.TimerInterceptor=DEBUG
log4j.appender.A=org.apache.log4j.ConsoleAppender
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern==%-d{yyyy-MM-dd HH:mm:ss} [%p]-[%c] %m%n
log4j.rootLogger=WARN,A
log4j.logger.indiv.dulk.wechat=DEBUG,wechat
log4j.appender.A=org.apache.log4j.ConsoleAppender
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p]-[%c] %m%n
log4j.appender.wechat=org.apache.log4j.ConsoleAppender
log4j.appender.wechat.layout=org.apache.log4j.PatternLayout
log4j.appender.wechat.layout.ConversionPattern=[%p]-[%c] %m%n
log4j.rootLogger=WARN,A
log4j.logger.indiv.dulk.wechat=DEBUG,wechat
log4j.appender.A=org.apache.log4j.ConsoleAppender
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p]-[%c] %m%n
log4j.appender.wechat=org.apache.log4j.ConsoleAppender
log4j.appender.wechat.layout=org.apache.log4j.PatternLayout
log4j.appender.wechat.layout.ConversionPattern=[%p]-[%c] %m%n

log4j.rootLogger=WARN,A
log4j.logger.indiv.dulk.wechat=DEBUG,wechat
#不受全局管理
log4j.additivity.indiv.dulk.wechat=false
log4j.appender.A=org.apache.log4j.ConsoleAppender
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p]-[%c] %m%n
log4j.appender.wechat=org.apache.log4j.ConsoleAppender
log4j.appender.wechat.layout=org.apache.log4j.PatternLayout
log4j.appender.wechat.layout.ConversionPattern=[%p]-[%c] %m%n
log4j.rootLogger=WARN,A
log4j.logger.indiv.dulk.wechat=DEBUG,wechat
#不受全局管理
log4j.additivity.indiv.dulk.wechat=false
log4j.appender.A=org.apache.log4j.ConsoleAppender
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p]-[%c] %m%n
log4j.appender.wechat=org.apache.log4j.ConsoleAppender
log4j.appender.wechat.layout=org.apache.log4j.PatternLayout
log4j.appender.wechat.layout.ConversionPattern=[%p]-[%c] %m%n

3.3 日志输出地址 Appender
log4j.appender.appenderName = fully.qualified.name.of.appender.class (有资格的appender类的全名)
log4j.appender.appenderName.option1 = value1
log4j.appender.appenderName.option = valueN
log4j.appender.appenderName = fully.qualified.name.of.appender.class (有资格的appender类的全名)
log4j.appender.appenderName.option1 = value1
log4j.appender.appenderName.option = valueN
- org.apache.log4j.ConsoleAppender(控制台)
- org.apache.log4j.FileAppender(文件)
- org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
3.4 日志输出格式 Layout
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
log4j.appender.appenderName.layout.option = valueN
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
log4j.appender.appenderName.layout.option = valueN
- org.apache.log4j.HTMLLayout(以HTML表格形式布局)
- org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
- org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
- org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
log4j.appender.log.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t ] %m%n
log4j.appender.log.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t ] %m%n
- %m 输出代码中指定的消息
- %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
- %r 输出自应用启动到输出该log信息耗费的毫秒数
- %c 输出所属的类目,通常就是所在类的全名
- %t 输出产生该日志事件的线程名
- %n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n”
- %d 输出日志时间点的日期或时间。默认格式为ISO8601,也可以在其后指定格式。比如:%d{yyy MMM dd HH:mm:ss , SSS},输出类似:2002年10月18日 22:10:28, 921
- %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数
3.5 配置示例
### 设置###
log4j.rootLogger = debug,stdout,D,E
### 输出信息到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 设置###
log4j.rootLogger = debug,stdout,D,E
### 输出信息到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
#指定目录下包下的日志信息都存放到数据库
log4j.logger.database=DEBUG,oracledb
log4j.appender.oracledb=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.oracledb.Driver=oracle.jdbc.driver.OracleDriver
log4j.appender.oracledb.URL=jdbc:oracle:thin:@192.168.20.92:1521:chshsid(切忌此处为sid而不是数据库名)
log4j.appender.oracledb.user=scott
log4j.appender.oracledb.password=tiger
#log4j.appender.encoding=utf-8
log4j.appender.oracledb.sql=INSERT INTO enter_ora_log4j VALUES ('%d{yyyy-MM-dd HH:mm:ss}', '%t', '%p', '%l', '%m')
log4j.appender.oracledb.layout=org.apache.log4j.PatternLayout
#指定目录下包下的日志信息都存放到数据库
log4j.logger.database=DEBUG,oracledb
log4j.appender.oracledb=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.oracledb.Driver=oracle.jdbc.driver.OracleDriver
log4j.appender.oracledb.URL=jdbc:oracle:thin:@192.168.20.92:1521:chshsid(切忌此处为sid而不是数据库名)
log4j.appender.oracledb.user=scott
log4j.appender.oracledb.password=tiger
#log4j.appender.encoding=utf-8
log4j.appender.oracledb.sql=INSERT INTO enter_ora_log4j VALUES ('%d{yyyy-MM-dd HH:mm:ss}', '%t', '%p', '%l', '%m')
log4j.appender.oracledb.layout=org.apache.log4j.PatternLayout
#指定目录下的java类的日志信息都存放到该目录下
log4j.logger.com.cuigq.TestError=DEBUG,R2
log4j.appender.R2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R2.File=d:/loginfo/html.html
#log4j.appender.R2.MaxFileSize=500KB
#log4j.appender.R2.MaxBackupIndex=1
log4j.appender.R2.layout=org.apache.log4j.HTMLLayout
#log4j.appender.R2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
#指定目录下的java类的日志信息都存放到该目录下
log4j.logger.com.cuigq.TestError=DEBUG,R2
log4j.appender.R2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R2.File=d:/loginfo/html.html
#log4j.appender.R2.MaxFileSize=500KB
#log4j.appender.R2.MaxBackupIndex=1
log4j.appender.R2.layout=org.apache.log4j.HTMLLayout
#log4j.appender.R2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
#指定目录下包下的日志信息都存放到该目录下
log4j.logger.cn.com.cuigq.Theard=DEBUG,R1
log4j.appender.R1=org.apache.log4j.RollingFileAppender
log4j.appender.R1.File=d:/loginfo/iamSystem1.log
log4j.appender.R1.MaxFileSize=500KB
log4j.appender.R1.MaxBackupIndex=1
log4j.appender.R1.layout=org.apache.log4j.PatternLayout
log4j.appender.R1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
#指定目录下包下的日志信息都存放到该目录下
log4j.logger.cn.com.cuigq.Theard=DEBUG,R1
log4j.appender.R1=org.apache.log4j.RollingFileAppender
log4j.appender.R1.File=d:/loginfo/iamSystem1.log
log4j.appender.R1.MaxFileSize=500KB
log4j.appender.R1.MaxBackupIndex=1
log4j.appender.R1.layout=org.apache.log4j.PatternLayout
log4j.appender.R1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
4、基本使用 和 Web下的使用
4.1 基本步骤流程
4.1.1 得到日志记录器Logger
public static Logger getLogger( String name)
public static Logger getLogger( String name)
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName ())
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName ())
4.1.2 读取配置文件
BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境
PropertyConfigurator.configure (String configFilename) :读取使用Java的特性文件编写的配置文件
DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件
BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境
PropertyConfigurator.configure (String configFilename) :读取使用Java的特性文件编写的配置文件
DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件
4.1.3 插入记录信息
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;
4.2 入门使用
4.3 Web使用
<servlet>
<servlet-name>InitLog4jServlet</servlet-name>
<servlet-class>indiv.dulk.wechat.init.InitLog4jServlet</servlet-class>
<init-param>
<param-name>propertiesLocation</param-name>
<param-value>/WEB-INF/classes/log4j.properties</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet>
<servlet-name>InitLog4jServlet</servlet-name>
<servlet-class>indiv.dulk.wechat.init.InitLog4jServlet</servlet-class>
<init-param>
<param-name>propertiesLocation</param-name>
<param-value>/WEB-INF/classes/log4j.properties</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
public class InitLog4jServlet extends HttpServlet{
/**
* Servlet初始化的执行方法,用以加载log4j配置文件
*
* @throws ServletException
*/
@Override
public void init() throws ServletException {
System.out.println("*** Log4jInitServlet正在初始化log4j日志设置信息 ***");
String log4jLocation = getInitParameter("propertiesLocation");
if (log4jLocation == null) {
System.err.println("*** 没有找到log4j的properties配置文件,使用缺省log4j环境初始化 ***");
BasicConfigurator.configure();
} else {
String webAppPath = getServletContext().getRealPath("/");
String log4jRealLocation = webAppPath + log4jLocation;
File log4jFile = new File(log4jRealLocation);
if (log4jFile.exists()) {
System.out.println("*** 使用" + log4jRealLocation + "进行log4j环境初始化 ***");
PropertyConfigurator.configure(log4jRealLocation);
} else {
System.err.println("*** " + log4jRealLocation + "文件未找到,使用缺省log4j环境初始化 ***");
BasicConfigurator.configure();
}
}
}
}
public class InitLog4jServlet extends HttpServlet{
/**
* Servlet初始化的执行方法,用以加载log4j配置文件
*
* @throws ServletException
*/
@Override
public void init() throws ServletException {
System.out.println("*** Log4jInitServlet正在初始化log4j日志设置信息 ***");
String log4jLocation = getInitParameter("propertiesLocation");
if (log4jLocation == null) {
System.err.println("*** 没有找到log4j的properties配置文件,使用缺省log4j环境初始化 ***");
BasicConfigurator.configure();
} else {
String webAppPath = getServletContext().getRealPath("/");
String log4jRealLocation = webAppPath + log4jLocation;
File log4jFile = new File(log4jRealLocation);
if (log4jFile.exists()) {
System.out.println("*** 使用" + log4jRealLocation + "进行log4j环境初始化 ***");
PropertyConfigurator.configure(log4jRealLocation);
} else {
System.err.println("*** " + log4jRealLocation + "文件未找到,使用缺省log4j环境初始化 ***");
BasicConfigurator.configure();
}
}
}
}
public class InitWechatServlet extends HttpServlet{
private static Logger log = Logger.getLogger(InitWechatServlet.class);
/**
* 刷新的间隔时间(单位:毫秒),默认为1h,可以在web.xml自定义配置
*/
private long period = 3600000;
/**
* 时间间隔时需要执行的任务内容
*/
private TimerTask timerTask = new TimerTask() {
@Override
public void run() {
//获取最新的access_token并设定到WeChatAPI类中的静态属性中去
WechatAPI.setAccessToken(WechatUtil.getNewAccessToken());
log.info("微信accessToken刷新 " + WechatAPI.getAccessToken());
}
};
}
public class InitWechatServlet extends HttpServlet{
private static Logger log = Logger.getLogger(InitWechatServlet.class);
/**
* 刷新的间隔时间(单位:毫秒),默认为1h,可以在web.xml自定义配置
*/
private long period = 3600000;
/**
* 时间间隔时需要执行的任务内容
*/
private TimerTask timerTask = new TimerTask() {
@Override
public void run() {
//获取最新的access_token并设定到WeChatAPI类中的静态属性中去
WechatAPI.setAccessToken(WechatUtil.getNewAccessToken());
log.info("微信accessToken刷新 " + WechatAPI.getAccessToken());
}
};
}
5、参考链接
log4j的基本使用和参数设定的更多相关文章
- 编写高质量代码改善C#程序的157个建议[优先考虑泛型、避免在泛型中声明静态成员、为泛型参数设定约束]
前言 泛型并不是C#语言一开始就带有的特性,而是在FCL2.0之后实现的新功能.基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用.同时,它减少了泛型类及泛型方法中的转型,确保了类型安全.委托 ...
- I.MX6 bootargs 内核参数设定
/******************************************************************** * I.MX6 bootargs 内核参数设定 * 说明: ...
- 解决JDeveloper运行慢的设置/BPM/SOA Server JVM参数设定
最近在使用 Jdeveloper 10.1.3.3 版本时发现速度奇慢无比,后经Google,发现如下解决方案:在 jdev.conf 文件的末尾加上如下两行,速度即可得到显着的提高, jdev.co ...
- jmeter压测参数设定(转)
jmeter压测参数设定 一.基本公式 线程数 = QPS * time: 注:QPS--每秒完成请求的个数:time--每个请求响应完成平均需要时间: 故QPS * time就是所有请求完成响应所需 ...
- Unity3d之树木创建的参数设定
Unity3d之树木创建的参数设定 通常Unity3d创建树木经常会创建出很多奇葩的种类=_=,以下是创建出比较正常树木的基本参数 1:> 基本树干形状建立: 选择根建立分枝干设置分支干Di ...
- 编写高质量代码改善C#程序的157个建议——建议34:为泛型参数设定约束
建议34:为泛型参数设定约束 “约束”这个词可能会引起歧义,有些人肯能认为对泛型参数设定约束是限制参数的使用,实际情况正好相反.没有“约束”的泛型参数作用很有限,倒是“约束”让泛型参数具有了更多的行为 ...
- haproxy代理配置段参数设定
代理配置段:有四个配置段 default:设定默认参数, frontenf:前端服务器的设定 backend:后端服务器的设定 listening:是设定前端和后端一一对应的设定 参数: 1bind: ...
- ANdroid手机屏幕反横向等参数设定
经过我一番百度和看Android文档,我才发现,Android对旋转屏,特别是只有横屏或者竖屏虽重力旋转的支持是到Android4.3.1才有完美支持的 unspecified - 默认值,由系统选择 ...
- log4j 文档
log4j中文文档 中文详细教程 log4j中文文档 这篇文章描述了Log4j的API.独一无二的特色和设计原理.Log4j是一个聚集了许多作者劳动成果的开源软件项目.它允许开发人眼以任意的粒度 ...
随机推荐
- 淘宝IP地址库采集
作者:阿宝 更新:2016-08-31 来源:彩色世界(https://blog.hz601.org/2016/08/31/taobao-ip-sniffer/index.html) 简述 当初选择做 ...
- 【Oracle】控制文件管理
/* 控制文件是oracle数据库最重要的物理文件之一,每个oracle数据库都必须有一个控制文件,在启动数据库实例时, oracle会根据初始化参数查找到控制文件的名称及位置信息,并读取控制文件的内 ...
- js获取ip地址,操作系统,浏览器版本等信息,可兼容
这次呢,说一下使用js获取用户电脑的ip信息,刚开始只是想获取用户ip,后来就顺带着获取了操作系统和浏览器信息. 先说下获取用户ip地址,包括像ipv4,ipv6,掩码等内容,但是大部分都要根据浏览器 ...
- 最强黑吃黑:WEBSHELL大马隐藏万能密码大全
因为很多原因,很多新手都不会编写自己的大马,大多数新手都会通过百度去下载对应脚本的大马,然而这些webshell大马都是早期流传出来的,基本上都存在后门,可以通过万能密码登录,即使你修改i过密码了,怎 ...
- latex 生成pdf
我个人还是比较推崇传统的方法:先生成dvi,在生成pdf. 直接在winEdt中点击最下方的Windows Command Prompt, 否则从cmd进入命令行的话,还要进入tex文件夹,好麻烦. ...
- linux下权限问题思考
今天遇到一些关于linux的权限问题,文件的所有者,文件的所属组等问题,文件对于所有者所属组是非常敏感的,同一个脚本所属者所属组不同,得到执行的结果也是差很多的.
- class对象详解
我们知道,对于java语言,我们一般先写一个类对象,表示对某一类对象概述,其中包括属性,方法等.我们在对类对象编译时,会产生一个.class对象,jvm在加载类对象时,是加载.class 对象文件,我 ...
- java面向对象理解
面向对象:世间一切事物均可认为是对象,用户不必了解软件内部的实现机制,可根据需要直接调用接口,生成一个正常工作的应用程序. 面向对象的特点:抽象,封装,继承,多态性, 对象:对象就是一个具有明确行为的 ...
- ehcache memcache redis 三大缓存对比
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt268 最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今 ...
- js变量以及其作用域详解
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp73 一.变量的类型 Javascript和Java.C这些语言不同 ...