細說Java主流日志工具庫

目錄

  • 概述
  • ??java.util.logging (JUL)
  • ??Log4j
  • ??Logback
  • ??Log4j vs Logback
  • ??common-logging
  • ??slf4j
  • ??common-logging vs slf4j
  • ??總結
  • 實施日志解決方案
  • ??引入jar包
  • ????slf4j直接綁定日志組件
  • ????slf4j兼容非slf4j日志組件
  • ????spring 集成 slf4j
  • ????common-logging綁定日志組件
  • ??配置
  • ????完整的logback.xml參考示例
  • ????完整的log4j.xml參考示例
  • ????logback配置參數說明
  • ??使用API
  • ????slf4j用法
  • ????common-logging用法
  • 參考

概述

在項目開發中,為了跟蹤代碼的運行情況,常常要使用日志來記錄信息。
在Java世界,有很多的日志工具庫來實現日志功能,避免了我們重復造輪子。
我們先來逐一了解一下主流日志工具。

java.util.logging (JUL)

JDK1.4開始,通過java.util.logging提供日志功能。
它能滿足基本的日志需要,但是功能沒有Log4j強大,而且使用范圍也沒有Log4j廣泛。

Log4j

Log4j是apache的一個開源項目,創始人Ceki Gulcu。
Log4j應該說是Java領域資格最老,應用最廣的日志工具。從誕生之日到現在一直廣受業界歡迎。
Log4j是高度可配置的,并可通過在運行時的外部文件配置。它根據記錄的優先級別,并提供機制,以指示記錄信息到許多的目的地,諸如:數據庫,文件,控制臺,UNIX系統日志等。
Log4j中有三個主要組成部分:

  • loggers:?負責捕獲記錄信息。
  • appenders :?負責發布日志信息,以不同的首選目的地。
  • layouts:?負責格式化不同風格的日志信息。
    官網地址

Logback

Logback是由log4j創始人Ceki Gulcu設計的又一個開源日記組件,目標是替代log4j。
logback當前分成三個模塊:logback-core,logback- classiclogback-access
logback-core是其它兩個模塊的基礎模塊。
logback-classic是log4j的一個 改良版本。此外logback-classic完整實現SLF4J API使你可以很方便地更換成其它日記系統如log4j或JDK14 Logging。
logback-access訪問模塊與Servlet容器集成提供通過Http來訪問日記的功能。?
官網地址

Log4j vs Logback

Logback相比Log4j具有許多好處:
性能提升
logback在log4j基礎上做了優化,使性能提高了近10倍。此外,內存開銷也減少了。
更充足的測試
盡管log4j也做了測試,但是logback的測試更加充分。所以,logback應該更加穩定。
天然支持slf4j
因為Logback-classic完全實現了slf4j的接口,所以天然支持slf4j。使用slf4j,有利于你切換日志工具庫,減少工作量。
自動重載配置文件
Logback-classic可以自動重載更新過的配置文件。
自動移除舊日志
通過配置文件最大數和過期時間,Logback可以控制日志文件數并自動清除過期的日志。
更靈活、更精細的配置
Logback在配置中提供更加豐富的功能來幫助你更加精細的去定制你的日志組件:
<filter>提供比log4j更豐富的過濾條件;
增加<if>,?<then>?和?<else>這樣的條件控制;
打印異常的調用棧信息
Logback在打印異常時,會打印調用棧的包裝數據。
Logback-access
Logback-access支持Logback-classic的所有特性,并且它可以提供豐富的HTTP-access日志功能。
總結
以上優點摘自官方推薦理由:Reasons to prefer logback over log4j。
由于Logback的作者也是Log4j的作者,所有推薦理由應該比較靠譜。
總之,相比于Log4j,好處多多,你心動了沒?

common-logging

common-logging是apache的一個開源項目。也稱Jakarta Commons Logging,縮寫JCL
common-logging的功能是提供日志功能的API接口,本身并不提供日志的具體實現(當然,common-logging內部有一個Simple logger的簡單實現,但是功能很弱,直接忽略),而是在運行時動態的綁定日志實現組件來工作(如log4j、java.util.loggin)。
官網地址

slf4j

全稱為Simple Logging Facade for Java,即java簡單日志門面。
什么,作者又是Ceki Gulcu!這位大神寫了Log4j、Logback和slf4j,專注日志組件開發五百年,一直只能超越自己。
類似于Common-Logging,slf4j是對不同日志框架提供的一個API封裝,可以在部署的時候不修改任何配置即可接入一種日志實現方案。但是,slf4j在編譯時靜態綁定真正的Log庫。使用SLF4J時,如果你需要使用某一種日志實現,那么你必須選擇正確的SLF4J的jar包的集合(各種橋接包)。
官網地址

common-logging vs slf4j

slf4j庫類似于Apache Common-Logging。但是,他在編譯時靜態綁定真正的日志庫。這點似乎很麻煩,其實也不過是導入橋接jar包而已。
slf4j一大亮點是提供了更方便的日志記錄方式:
不需要使用logger.isDebugEnabled()來解決日志因為字符拼接產生的性能問題。slf4j的方式是使用{}作為字符串替換符,形式如下:

logger.debug("id: {}, name: {} ", id, name);

總結

綜上所述,使用slf4j + Logback可謂是目前最理想的日志解決方案了。
接下來,就是如何在項目中實施了。

實施日志解決方案

使用日志解決方案基本可分為三步:

  1. 引入jar包
  2. 配置
  3. 使用API
    常見的各種日志解決方案的第2步和第3步基本一樣,實施上的差別主要在第1步,也就是使用不同的庫。

引入jar包

這里首選推薦使用slf4j + logback 的組合。
如果你習慣了common-logging,可以選擇common-logging+log4j。
強烈建議不要直接使用日志實現組件(logback、log4j、java.util.logging),理由前面也說過,就是無法靈活替換日志庫。
還有一種情況:你的老項目使用了common-logging,或是直接使用日志實現組件。如果修改老的代碼,工作量太大,需要兼容處理。在下文,都將看到各種應對方法。
注:據我所知,當前仍沒有方法可以將slf4j橋接到common-logging。如果我孤陋寡聞了,請不吝賜教。

slf4j直接綁定日志組件

slf4j + logback
添加依賴到pom.xml中即可。
logback-classic-1.0.13.jar?會自動將?slf4j-api-1.7.21.jar?和?logback-core-1.0.13.jar?也添加到你的項目中。

<dependency> <groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.0.13</version>
</dependency>

slf4j + log4j
添加依賴到pom.xml中即可。
slf4j-log4j12-1.7.21.jar?會自動將?slf4j-api-1.7.21.jar?和?log4j-1.2.17.jar?也添加到你的項目中。

<dependency> <groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.21</version>
</dependency>

slf4j + java.util.logging
添加依賴到pom.xml中即可。
slf4j-jdk14-1.7.21.jar?會自動將?slf4j-api-1.7.21.jar?也添加到你的項目中。

<dependency> <groupId>org.slf4j</groupId><artifactId>slf4j-jdk14</artifactId><version>1.7.21</version>
</dependency>

slf4j兼容非slf4j日志組件

在介紹解決方案前,先提一個概念——橋接
什么是橋接呢
假如你正在開發應用程序所調用的組件當中已經使用了common-logging,這時你需要 jcl-over-slf4j.jar把日志信息輸出重定向到 slf4j-api,slf4j-api再去調用slf4j實際依賴的日志組件。這個過程稱為橋接。
下圖是官方的slf4j橋接策略圖:

從圖中應該可以看出,無論你的老項目中使用的是common-logging或是直接使用log4j、java.util.logging,都可以使用對應的橋接jar包來解決兼容問題。

slf4j兼容common-logging

<dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>1.7.12</version>
</dependency>

slf4j兼容log4j

<dependency><groupId>org.slf4j</groupId><artifactId>log4j-over-slf4j</artifactId><version>1.7.12</version>
</dependency>

slf4j兼容java.util.logging

<dependency><groupId>org.slf4j</groupId><artifactId>jul-to-slf4j</artifactId><version>1.7.12</version>
</dependency>

spring 集成 slf4j

做java web開發,基本離不開spring框架。很遺憾,spring使用的日志解決方案是common-logging + log4j。
所以,你需要一個橋接jar包:logback-ext-spring

<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.1.3</version>
</dependency>
<dependency><groupId>org.logback-extensions</groupId><artifactId>logback-ext-spring</artifactId><version>0.1.2</version>
</dependency>
<dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>1.7.12</version>
</dependency>

common-logging綁定日志組件

common-logging + log4j
添加依賴到pom.xml中即可。

<dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version>
</dependency>
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>

配置

日志配置文件大同小異,需要注意的是:logback.xml和log4j.xml都需要放在classpath路徑下

完整的logback.xml參考示例

在下面的配置文件中,我為自己的項目代碼(根目錄:org.zp.notes.spring)設置了五種等級:
TRACE、DEBUG、INFO、WARN、ERROR,優先級依次從低到高。
因為關注spring框架本身的一些信息,我增加了專門打印spring WARN及以上等級的日志。

<?xml version="1.0" encoding="UTF-8" ?><!-- logback中一共有5種有效級別,分別是TRACE、DEBUG、INFO、WARN、ERROR,優先級依次從低到高 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false"><property name="DIR_NAME" value="spring-helloworld"/><!-- 將記錄日志打印到控制臺 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n</pattern></encoder></appender><!-- RollingFileAppender begin --><appender name="ALL" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 根據時間來制定滾動策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${user.dir}/logs/${DIR_NAME}/all.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><!-- 根據文件大小來制定滾動策略 --><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>30MB</maxFileSize></triggeringPolicy><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n</pattern></encoder></appender><appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 根據時間來制定滾動策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${user.dir}/logs/${DIR_NAME}/error.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><!-- 根據文件大小來制定滾動策略 --><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>10MB</maxFileSize></triggeringPolicy><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n</pattern></encoder></appender><appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 根據時間來制定滾動策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${user.dir}/logs/${DIR_NAME}/warn.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><!-- 根據文件大小來制定滾動策略 --><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>10MB</maxFileSize></triggeringPolicy><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>WARN</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n</pattern></encoder></appender><appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 根據時間來制定滾動策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${user.dir}/logs/${DIR_NAME}/info.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><!-- 根據文件大小來制定滾動策略 --><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>10MB</maxFileSize></triggeringPolicy><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>INFO</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n</pattern></encoder></appender><appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 根據時間來制定滾動策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${user.dir}/logs/${DIR_NAME}/debug.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><!-- 根據文件大小來制定滾動策略 --><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>10MB</maxFileSize></triggeringPolicy><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>DEBUG</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n</pattern></encoder></appender><appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 根據時間來制定滾動策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${user.dir}/logs/${DIR_NAME}/trace.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><!-- 根據文件大小來制定滾動策略 --><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>10MB</maxFileSize></triggeringPolicy><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>TRACE</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n</pattern></encoder></appender><appender name="SPRING" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 根據時間來制定滾動策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${user.dir}/logs/${DIR_NAME}/springframework.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><!-- 根據文件大小來制定滾動策略 --><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>10MB</maxFileSize></triggeringPolicy><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n</pattern></encoder></appender><!-- RollingFileAppender end --><!-- logger begin --><!-- 本項目的日志記錄,分級打印 --><logger name="org.zp.notes.spring" level="TRACE" additivity="false"><appender-ref ref="STDOUT"/><appender-ref ref="ERROR"/><appender-ref ref="WARN"/><appender-ref ref="INFO"/><appender-ref ref="DEBUG"/><appender-ref ref="TRACE"/></logger><!-- SPRING框架日志 --><logger name="org.springframework" level="WARN" additivity="false"><appender-ref ref="SPRING"/></logger><root level="TRACE"><appender-ref ref="ALL"/></root><!-- logger end --></configuration>

完整的log4j.xml參考示例

log4j的配置文件一般有xml格式或properties格式。這里為了和logback.xml做個對比,就不介紹properties了,其實也沒太大差別。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'><appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"><layout class="org.apache.log4j.PatternLayout"><param name="ConversionPattern"value="%d{yyyy-MM-dd HH:mm:ss,SSS\} [%-5p] [%t] %c{36\}.%M - %m%n"/></layout><!--過濾器設置輸出的級別--><filter class="org.apache.log4j.varia.LevelRangeFilter"><param name="levelMin" value="debug"/><param name="levelMax" value="fatal"/><param name="AcceptOnMatch" value="true"/></filter></appender><appender name="ALL" class="org.apache.log4j.DailyRollingFileAppender"><param name="File" value="${user.dir}/logs/spring-common/jcl/all"/><param name="Append" value="true"/><!-- 每天重新生成日志文件 --><param name="DatePattern" value="'-'yyyy-MM-dd'.log'"/><!-- 每小時重新生成日志文件 --><!--<param name="DatePattern" value="'-'yyyy-MM-dd-HH'.log'"/>--><layout class="org.apache.log4j.PatternLayout"><param name="ConversionPattern"value="%d{yyyy-MM-dd HH:mm:ss,SSS\} [%-5p] [%t] %c{36\}.%M - %m%n"/></layout></appender><!-- 指定logger的設置,additivity指示是否遵循缺省的繼承機制--><logger name="org.zp.notes.spring" additivity="false"><level value="error"/><appender-ref ref="STDOUT"/><appender-ref ref="ALL"/></logger><!-- 根logger的設置--><root><level value="warn"/><appender-ref ref="STDOUT"/></root>
</log4j:configuration>

logback配置參數說明

logback基本兼容log4j的配置,并提供更多的功能。
這里奉獻一張本人整理的logback配置思維導圖,高清無碼。

使用API

slf4j用法

使用slf4j的API很簡單。使用LoggerFactory初始化一個Logger實例,然后調用Logger對應的打印等級函數就行了。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class App {private static final Logger log = LoggerFactory.getLogger(App.class);public static void main(String[] args) {String msg = "print log, current level: {}";log.trace(msg, "trace");log.debug(msg, "debug");log.info(msg, "info");log.warn(msg, "warn");log.error(msg, "error");}
}

common-logging用法

common-logging用法和slf4j幾乎一樣,但是支持的打印等級多了一個更高級別的:fatal
此外,common-logging不支持{}替換參數,你只能選擇拼接字符串這種方式了。

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;public class JclTest {private static final Log log = LogFactory.getLog(JclTest.class);public static void main(String[] args) {String msg = "print log, current level: ";log.trace(msg + "trace");log.debug(msg + "debug");log.info(msg + "info");log.warn(msg + "warn");log.error(msg + "error");log.fatal(msg + "fatal");}
}

參考

slf4官方文檔
logback官方文檔
log4j官方文檔
commons-logging官方文檔
http://blog.csdn.net/yycdaizi/article/details/8276265

作者:靜默虛空
歡迎任何形式的轉載,但請務必注明出處。
限于本人水平,如果文章和代碼有表述不當之處,還請不吝賜教。

轉載于:https://www.cnblogs.com/wangchaoyuana/p/7507485.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257457.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257457.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257457.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL2008使用json.net實現XML與JSON互轉

借助CLR&#xff0c;首先實現字符串的互轉&#xff0c;然后使用存儲過程實現JSON2table public class JsonFunction { /// <summary> /// XML轉JSON /// </summary> /// <param name"xml"></param> /// <returns></returns> ///…

黑胡桃木php,揭秘美國黑胡桃木的美

家具是藝術和文化的載體&#xff0c;人們對木的喜愛&#xff0c;是一種與生俱來的情懷。好的木材淳厚質樸、溫潤堅定&#xff0c;有著不動聲色的力量。美國黑胡桃木(亦稱黑核桃木)便是如此&#xff0c;“身體”中散發著讓人無法抗拒的魅力&#xff01;美國黑胡桃木體現的是“深…

c mysql備份還原數據庫,MySQL數據庫備份與恢復方法

常有新手問我該怎么備份數據庫&#xff0c;下面介紹3種備份數據庫的方法&#xff1a;(1)備份數據庫文件MySQL中的每一個數據庫和數據表分別對應文件系統中的目錄和其下的文件。在Linux下數據庫文件的存放目錄一般為/var/lib/mysql。在Windows下這個目錄視MySQL的安裝路徑而定&a…

第四篇:白話tornado源碼之褪去模板外衣的前戲

加班程序員最辛苦&#xff0c;來張圖醒醒腦吧&#xff01; ... ... ... 好了&#xff0c;醒醒吧&#xff0c;回歸現實看代碼了&#xff01;&#xff01; 執行字符串表示的函數&#xff0c;并為該函數提供全局變量 本篇的內容從題目中就可以看出來&#xff0c;就是為之后剖析tor…

生活常識

雷雨天野外要關手機 溫漢華介紹&#xff0c;雷雨天&#xff0c;山頂空曠處容易遭雷電襲擊。 他同時提醒&#xff0c;若游客在山上游覽時&#xff0c;遭遇到電閃雷鳴的暴雨天氣時&#xff0c;一定要注意以下事項&#xff1a; 其一&#xff0c;關停自己的手機。 其二&#xff0c;…

主程序分析法MATLAB編程,專題五??概率統計問題的Matlab求解

【實驗目的及要求】I&#xff0e;熟練掌握Matlab編程中常見概率分布的概率密度、概率分布、逆分布、均值和方差等語句的調用格式&#xff0c;學會用Matlab對服從各種分布的樣本進行參數估計和假設檢驗。對實際問題&#xff0c;能夠進行樣本的分析&#xff0c;得出服從哪種分布的…

LFS(Linux From Scratch)學習

一、環境準備 使用Debian平臺&#xff0c;需做如下環境檢查&#xff1a; 1、檢查各個需要的工具及內核版本號&#xff0c;看看是否符合lfs7.7的列表要求 2、檢查需要用到的庫&#xff0c;一共有三個&#xff0c;gmp, mpfr和mpc 工具檢查腳本如下&#xff1a; #filename:check_e…

騰訊云 Centos 配置 JDK Tomcat Mysql

配置JDK 從 oracle 官網下載 rpm 版本的 jdk 包,官方鏈接:點擊此處跳轉。下載jdk的時候記得看一看自己的系統是 64 位還是 32 位的&#xff0c;下對應的版本。下載好以后上傳到騰訊云服務器中,命令格式為 scp &#xff3b;文件路徑] &#xff3b;云主機用戶名ip地址]:[服務器上…

php 取url根域名,php中取得URL的根域名的代碼

/*** 取得根域名** author lonely* create 2011-3-11* version 0.1* lastupdate lonely* package Sl*/class Sl_RootDomain{private static $self;private $domainnull;private $hostnull;private $state_domain;private $top_domain;/*** 取得域名分析實例* Enter description…

如何創建sequence

我用的是在oracle中的方法&#xff0c;在oracle中sequence就是所謂的序列號&#xff0c;每次取的時候它會自動增加&#xff0c;一般用在需要按序列號排序的地方。 1、Create Sequence 你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE權限&#xff0c; CREATE SEQUENCE SI_E…

簡易版jQuery——mQuery

前面的話 雖然jQuery已經日漸式微&#xff0c;但它里面的許多思想&#xff0c;如選擇器、鏈式調用、方法函數化、取賦值合體等&#xff0c;有的已經變成了標準&#xff0c;有的一直影響到現在。所以&#xff0c;jQuery是一個偉大的前端框架。前端世界日新月異&#xff0c;由于實…

LaTeX?安裝配置?OSX

LaTeX 安裝配置 OSX官方網站&#xff1a;http://www.latex-project.orghttp://www.tug.org/mactex/http://pages.uoregon.edu/koch/BasicTeX.pdf完整的Tex超過2G&#xff0c;一般用戶沒必要&#xff0c;可以先安裝BasicTeX&#xff0c;當有需要時include必要的庫即可1.安裝Basi…

php 正三角塔,PHP 環境塔建與數據類型轉換

手動塔建PHP開發環境安裝php c:\apps\php安裝apache c:\apps\apache1.配制apache配制c:\apps\apache\conf\httpd.confDocumentRoot"c:/apps/www" //指定工作目錄,WWW為自已創健Directoryindex index.php index.html // 加入:loadModule php5_module "c:\apps\PH…

C/C++基礎知識:函數指針和指針函數的基本概念

【函數指針】 在程序運行中&#xff0c;函數代碼是程序的算法指令部分&#xff0c;它們和數組一樣也占用存儲空間&#xff0c;都有相應的地址。可以使用指針變量指向數組的首地址&#xff0c;也可以使用指針變量指向函數代碼的首地址&#xff0c;指向函數代碼首地址的指針…

告警系統郵件引擎

2019獨角獸企業重金招聘Python工程師標準>>> 20.23-20.25 告警系統郵件引擎 創建發郵件的腳本——mail.py [rootlocalhost mail]# pwd /usr/local/sbin/mon/mail[rootlocalhost mail]# vim mail.py #!/usr/bin/env python #-*- coding: UTF-8 -*- import os,sys rel…

【HTTP 2】簡介(Introduction)

前情提要 在上一篇文章《【HTTP 2.0】 序言》中&#xff0c;我們簡要介紹了 HTTP 2 協議的概要和協議狀態。 在本篇文章中&#xff0c;我們將會了解到 HTTP 2 協議簡介&#xff08;Introduction&#xff09;部分的內容。 簡介&#xff08;Introduction&#xff09; 超文本傳輸協…

java測試類生成對象,java編寫student類 用Java編寫一段測試程序,生成student類的兩個對象,并輸出每個對象基本信息?...

java中怎么創建對象數組&#xff1f;比如我創建了一個學生類Student&#xff0c;怎么用這個類創建一個對象數組&#xff0c;麻煩給個例子&#xff1f;學生類&#xff1a;classA{privateStringnameprivateintagepublicStringgetName(){returnname}publicvoidsetName(Stringname)…

iOS -- SKScene類

SKScene類 繼承自SKEffectNode:SKNode:UIResponder:NSObject符合NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject)框架 /System/Library/Frameworks/SpriteKit.framework可用性可用于iOS 7.0或者更晚的版本聲明于SKScene.h參考指南Sprite Kit Progamming Guide概覽 重要提…

SSD硬盤 全盤安全擦除

此文From http://ssd.zol.com.cn/575/5753057.html 在SSD固態硬盤的使用過程中&#xff0c;部分用戶可能會碰到計算機意外掉電或死機并強行斷電后&#xff0c;系統出現異常&#xff0c;掃描SSD后發現壞塊&#xff0c;然后一著急一跺腳甚至想返廠維修。 其實掉電后固態硬盤出現壞…

php中等3秒再跳轉,跳轉和重定向

頁面跳轉在應用開發中&#xff0c;經常會遇到一些帶有提示信息的跳轉頁面&#xff0c;例如操作成功或者操作錯誤頁面&#xff0c;并且自動跳轉到另外一個目標頁面。系統的ThinkController類內置了兩個跳轉方法success和error&#xff0c;用于頁面跳轉提示&#xff0c;而且可以支…