明天的明天的明天

          用鍵盤(pán)改變生活

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            17 Posts :: 0 Stories :: 19 Comments :: 0 Trackbacks

          第一部分,快速入門(mén)

          首先,需要去下載LOG4J這個(gè)軟件并解壓縮出其中的log4j.jar.在你的應(yīng)用程序的classpath中包含該JAR文件,你也可以簡(jiǎn)單地將這個(gè)文件拷貝到JDK的%java_home%\lib\ext目錄下。
          在作完以上工作后,你可以將下面的代碼保存到名為T(mén)estLogging.java中:
          ##############################
          import org.apache.log4j.*;

          // How to use log4j
          public class TestLogging {

          // Initialize a logging category. Here, we get THE ROOT CATEGORY
          //static Category cat = Category.getRoot();
          // Or, get a custom category
          static Category cat = Category.getInstance(TestLogging.class.getName());

          // From here on, log away! Methods are: cat.debug(your_message_string),
          // cat.info(...), cat.warn(...), cat.error(...), cat.fatal(...)

          public static void main(String args[]) {
          // Try a few logging methods
          cat.debug("Start of main()");
          cat.info("Just testing a log message with priority set to INFO");
          cat.warn("Just testing a log message with priority set to WARN");
          cat.error("Just testing a log message with priority set to ERROR");
          cat.fatal("Just testing a log message with priority set to FATAL");

          // Alternate but INCONVENIENT form
          cat.log(Priority.DEBUG, "Calling init()");

          new TestLogging().init();
          }

          public void init() {
          java.util.Properties prop = System.getProperties();
          java.util.Enumeration enum = prop.propertyNames();

          cat.info("***System Environment As Seen By Java***");
          cat.debug("***Format: PROPERTY = VALUE***");

          while (enum.hasMoreElements()) {
          String key = (String) enum.nextElement();
          cat.info(key + " = " + System.getProperty(key));
          }
          }

          }

          ############################################################
          Log4J 默認(rèn)情況下可以記錄五個(gè)層次(由低到高)的日志消息。
          1) debug
          2)info
          3)warn
          4)error
          5)fatal

          在TestLoggin.class的目錄中保存下列行在一個(gè)名字為log4j.properties 文件中.默認(rèn)情況下,當(dāng)你在代碼中使用getRoot()或getInstance("category_name")時(shí),Log4j會(huì)在應(yīng)用程序的 classpath中查找該文件:
          ############################################
          log4j.rootCategory=DEBUG, dest1
          log4j.appender.dest1=org.apache.log4j.ConsoleAppender
          log4j.appender.dest1.layout=org.apache.log4j.PatternLayout
          ############################################
          ConsoleAppender指定的是控制臺(tái)附加器,即日志消息會(huì)輸出到控制臺(tái)上,而PatternLayout則指定了消息輸出的格式,默認(rèn)情況下格式為%m%n,%m指定的是消息內(nèi)容,%n指定的是操作系統(tǒng)平臺(tái)上的換行符,這里更類似于C語(yǔ)言中的輸出控制語(yǔ)句。
          現(xiàn)在,你可以編譯并且運(yùn)行TestLogging.java了,你可以獲得以下輸出結(jié)果:

          Start of main()
          Just testing a log message with priority set to INFO
          Just testing a log message with priority set to WARN
          Just testing a log message with priority set to ERROR
          Just testing a log message with priority set to FATAL
          Calling init()
          ***System Environment As Seen By Java***
          ***Format: PROPERTY = VALUE***
          java.runtime.name = Java(TM) 2 Runtime Environment, Standard Edition
          sun.boot.library.path = c:\jdk1.3\jre\bin
          java.vm.version = 1.3.0_02
          java.vm.vendor = Sun Microsystems Inc.
          ... and so on

          如果想打印消息的層次如debug,info,error等,那可以在log4j.properties 文件的最后一行上增加如下一行:
          log4j.appender.dest1.layout.ConversionPattern=%-5p: %m%n
          這一行覆蓋了默認(rèn)的消息輸出格式%m%n,%p指定的是打印消息的層次(info,debug...,其中-5指定的是五個(gè)字符的寬度,-指定的是左對(duì)齊),%m指定的是消息的內(nèi)容,%n指定的則是操作系統(tǒng)平臺(tái)上的換行符.
          當(dāng)作完這些工作后,無(wú)須重新編譯TestLogging.java,再次運(yùn)用TestLogg,會(huì)得到以下不出的輸出結(jié)果:
          DEBUG: Start of main()
          INFO : Just testing a log message with priority set to INFO
          WARN : Just testing a log message with priority set to WARN
          ERROR: Just testing a log message with priority set to ERROR
          FATAL: Just testing a log message with priority set to FATAL
          DEBUG: Calling init()
          INFO : ***System Environment As Seen By Java***
          DEBUG: ***Format: PROPERTY = VALUE***
          INFO : java.runtime.name = Java(TM) 2 Runtime Environment, Standard Edition
          INFO : sun.boot.library.path = c:\jdk1.3\jre\bin
          INFO : java.vm.version = 1.3.0_02
          INFO : java.vm.vendor = Sun Microsystems Inc.
          ... and so on

          如果不想輸出日志的DEBUG與INFO消息,那么可以修改"log4j.rotCategory=DEBUG,dest1"為:
          log4j.rootCategory=WARN,dest1
          該行文件告訴Log4j跳過(guò)層次低于WARN的消息輸出,也就是說(shuō)如DEBUG,INFO層次的消息將不會(huì)產(chǎn)生輸出,再次運(yùn)行TestLogging.class,得到以下結(jié)果:
          ####################
          WARN : Just testing a log message with priority set to WARN
          ERROR: Just testing a log message with priority set to ERROR
          FATAL: Just testing a log message with priority set to FATAL
          ####################

          第二部分 Log4j 詳解
          Log4j有三個(gè)主要的組件:category ,附件器和布局。
          在程序中,你可以初始化一個(gè)category 并且調(diào)用它的各種日志方法來(lái)將消息字符串記錄到日志中。
          一個(gè)category可以被配置用來(lái)輸出到多個(gè)目標(biāo),這些日志目標(biāo)在Log4j框架中被稱為附件器,這些附件器可以包括控制臺(tái)、文本文件、HTML文件、 XML文件甚至是Windows平的事件日志系統(tǒng),甚至可以被作為郵件被發(fā)送。而這些所有的目標(biāo)都是通過(guò)log4j.properties文件來(lái)進(jìn)行配置,對(duì)于使用Log4j框架的程序來(lái)講只是簡(jiǎn)單地調(diào)用類似于info()、debug()等的方法。
          附件器類可以是ConsoleAppender, FileAppender, SMTPAppender, SocketAppender, NTEventLogAppender, SyslogAppender, JMSAppender, AsyncAppender 和 NullAppender等。 附件器類可以使用布局(layout)來(lái)在發(fā)送消息到目標(biāo)之前進(jìn)行格式化。例如HTMLLayout將會(huì)把消息格式化為HTML 格式。
          除了可以記錄消息字符串到日志文件之外,同時(shí)還可以記錄日期、時(shí)間、消息層次、類名、源代碼的行數(shù)、方法名稱、線程名稱以及其它信息,而具體的輸出需要由附件器的布局管理器來(lái)配置。
          category的名字是大小寫(xiě)區(qū)分以"."分隔的一個(gè)字符串。一般情況下我們通常使用your_class_name.class.getName()來(lái)獲得一個(gè)JAVA類名來(lái)作為category的名字,例如testproj.util.test。
          Each word in the category name is said to be an ancestor of the subsequent words and a parent of the immediately following word. This is important because Log4j has this concept of inheriting priorities and appenders from ancestors until overridden in a particular category.
          有一個(gè)沒(méi)有名稱的category叫root,它就像xml的document元素,是所有category的祖先。
          可以使用以下代碼來(lái)初始一個(gè)根category或指定的category。
          ################
          Category cat = Category.getRoot();
          Category cat2 = Category.getInstance("your.category.name");
          ###################
          代表層次的常量由高到次是FATAL、ERROR、WARN、INFO和DEBUG,可以在log4j.properties中指定category所屬的層次,例如指定log4j.rootCategory=WARN,simple則意味調(diào)用root這個(gè)category的程序只會(huì)記錄WARN及 WARN以上的消息。如果沒(méi)有為一個(gè)category指定默認(rèn)的category,那么category將會(huì)從其父category來(lái)繼承。
          常見(jiàn)的Category類的日志方法有:
          public void log(Priority p, Object message);

          // Convenient shortcuts to the generic logging method
          public void debug(Object message);
          public void info(Object message);
          public void warn(Object message);
          public void error(Object message);
          public void fatal(Object message);

          log4j 只記錄層次與預(yù)設(shè)層次相等或更高級(jí)別的消息,如以下代碼:
          Category cat = Category.getRoot();
          cat.setPriority(Priority.ERROR);//設(shè)置預(yù)設(shè)層次為ERROR級(jí)
          // Later...
          //cat.info("Started processing..."); //這條消息將不會(huì)輸出,ERROR
          cat.error("User input is erroneous!"); //消息輸出,層次相等
          cat.fatal("Cannot process user input. Program terminated!"); //消息輸出,層次高于預(yù)設(shè)層次

          第三部分 Log4j 配置
          所有的配置工作應(yīng)該在log4j.properties文件中完成,而該文件一般須放在應(yīng)用程序的相同的目錄中。
          在日志系統(tǒng)使用之前,我們必須首先配置log4j.配置log4j意味著增加附件器到Category并且為每一個(gè)Category設(shè)置一個(gè)Layout。
          category之間是有繼承關(guān)系,但他們?cè)黾拥絣og4j.properties文件中的順序是不固定的。
          示例一:
          #############################################################
          # 設(shè)置log4j的根category所使用的預(yù)設(shè)層次是DEBUG,而只使用A1這個(gè)附件器.
          log4j.rootCategory=DEBUG, A1
          #附件器A1被設(shè)置為控制臺(tái)附件器。
          log4j.appender.A1=org.apache.log4j.ConsoleAppender
          #附件器使用的布局是PatternLayout,即模式布局
          log4j.appender.A1.layout=org.apache.log4j.PatternLayout
          #附件器A1的模式是%-4r [%t] %-5p %c %x - %m%n,其中%m代表消息字符串,%n代表?yè)Q行符,其它以%開(kāi)頭的字符代表的含義如下文。
          log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
          #################################################################
          示例二:
          #########################################################
          #### Use two appenders, one to log to console, another to log to a file
          log4j.rootCategory=debug, stdout, R
          # Print only messages of priority WARN or higher for your category
          log4j.category.your.category.name=WARN
          # Specifically inherit the priority level
          #log4j.category.your.category.name=INHERITED
          #### First appender writes to console
          log4j.appender.stdout=org.apache.log4j.ConsoleAppender

          log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
          # Pattern to output the caller's file name and line number.
          log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
          #### Second appender writes to a file
          log4j.appender.R=org.apache.log4j.RollingFileAppender
          log4j.appender.R.File=example.log
          # Control the maximum log file size
          log4j.appender.R.MaxFileSize=100KB
          # Archive log files (one backup file here)
          log4j.appender.R.MaxBackupIndex=1
          log4j.appender.R.layout=org.apache.log4j.PatternLayout
          log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
          ########################################################

          第四部分 Log4j中有用的Layout
          一些有用的layout有TTCCLayout, HTMLLayout, PatternLayout, SimpleLayout 和 XMLLayout.
          其中SimpleLayout和PatternLayout忽略JAVA throwable 接口派生出來(lái)的errors和Exceptions.HTMLLayout和XMLLayout處理這些異常。
          SimpleLayout的輸出中包含日志消息的層次,緊跟著“-”后面的日志消息字符串。例如:
          DEBUG - Hello World Message
          Patternlayout 可以根據(jù)輸出的模式字符串來(lái)決定消息的輸出,模式字符串類似于C語(yǔ)言中的模式字符串。例如PatternLayout中如果使用模式字符串“%r [%t] %-5p %c -%m%n”會(huì)輸出以下消息:
          176 [main] INFO org.foo.Bar -Located nearest gas station
          以下對(duì)各域作一下解釋:
          1)%r輸出程序開(kāi)始執(zhí)行之后的微秒數(shù)
          2)%t輸出當(dāng)前線程的名稱
          3)%-5p輸出消息的層次。
          4)%c 輸出category的名稱
          5)-%m及s是日志消息本身,%n是換行符。
          當(dāng)前在模式字符串中你可以嵌入任何想要輸出的字符。
          模式字符串中的模式如下:
          %m:消息本身
          %p:消息的層次
          %r:從程序開(kāi)始執(zhí)行到當(dāng)前日志產(chǎn)生時(shí)的時(shí)間間隔(微秒)
          %c:輸出當(dāng)前日志動(dòng)作所在的category名稱。例如:如果category名稱是"a.b.c","%c{2}"將會(huì)輸出"b.c". {2}意謂著輸出“以點(diǎn)分隔開(kāi)的category名稱的后兩個(gè)組件”,如果 {n}沒(méi)有,將會(huì)輸出整個(gè)category名稱.
          %t:輸出當(dāng)前線程的名稱
          %x:輸出和當(dāng)前線程相關(guān)聯(lián)的NDC(具體解釋見(jiàn)下文),尤其用到像java servlets這樣的多客戶多線程的應(yīng)用中。
          %n:輸出平臺(tái)相關(guān)的換行符。
          %%:輸出一個(gè)"%"字符
          %d:輸出日志產(chǎn)生時(shí)候的日期,當(dāng)然可以對(duì)日期的格式進(jìn)行定制。例如:%d{HH:mm:ss,SSSS}或者是%d{dd MMM yyyy HH:mm:ss,SSSS},如果沒(méi)有指定后面的格式,將會(huì)輸出ISO8601的格式。
          %l:輸出位置信息,相當(dāng)于%C.%M(%F:%L)的組合。
          %C:輸出日志消息產(chǎn)生時(shí)所在的類名,如果類名是“test.page.Class1”%C{1}表示輸出類名"Class1",%C{2}輸出"page.Class1",而%C則輸出"test.page.Class1"。
          %M:輸出日志消息產(chǎn)生時(shí)的方法名稱
          %F:輸出日志消息產(chǎn)生時(shí)所在的文件名稱
          %L:輸出代碼中的行號(hào)
          可以在%與模式字符之間加上修飾符來(lái)控制其最小寬度、最大寬度、和文本的對(duì)齊方式。如:
          1)%20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,默認(rèn)的情況下右對(duì)齊。
          2) %-20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,"-"號(hào)指定左對(duì)齊。
          3) %.30c:指定輸出category的名稱,最大的寬度是30,如果category的名稱大于30的話,就會(huì)將左邊多出的字符截掉,但小于30的話也不會(huì)有空格。
          4)%20.30c:如果category的名稱小于20就補(bǔ)空格,并且右對(duì)齊,如果其名稱長(zhǎng)于30字符,就從左邊交遠(yuǎn)銷出的字符截掉。
          4)%20.30c:



          第五部分 Log4j中附件器及相關(guān)的鍵值參數(shù)
          1.ConsoleAppender選項(xiàng)
          Threshold=WARN:指定日志消息的輸出最低層次。
          ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。
          Target=System.err:默認(rèn)情況下是:System.out,指定輸出控制臺(tái)
          2.FileAppender 選項(xiàng)
          Threshold=WARN:指定日志消息的輸出最低層次。
          ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。
          File=mylog.txt:指定消息輸出到mylog.txt文件。
          Append=false:默認(rèn)值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內(nèi)容。
          3.RollingFileAppender 選項(xiàng)
          Threshold=WARN:指定日志消息的輸出最低層次。
          ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。
          File=mylog.txt:指定消息輸出到mylog.txt文件。
          Append=false:默認(rèn)值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內(nèi)容。
          MaxFileSize=100KB: 后綴可以是KB, MB 或者是 GB. 在日志文件到達(dá)該大小時(shí),將會(huì)自動(dòng)滾動(dòng),即將原來(lái)的內(nèi)容移到mylog.log.1文件。
          MaxBackupIndex=2:指定可以產(chǎn)生的滾動(dòng)文件的最大數(shù)。
          4.DailyRollingFileAppender 選項(xiàng)
          Threshold=WARN:指定日志消息的輸出最低層次。
          ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。
          File=mylog.txt:指定消息輸出到mylog.txt文件。
          Append=false:默認(rèn)值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內(nèi)容。
          DatePattern='.'yyyy-ww:每周滾動(dòng)一次文件,即每周產(chǎn)生一個(gè)新的文件。當(dāng)然也可以指定按月、周、天、時(shí)和分。即對(duì)應(yīng)的格式如下:
          1)'.'yyyy-MM: 每月
          2)'.'yyyy-ww: 每周
          3)'.'yyyy-MM-dd: 每天
          4)'.'yyyy-MM-dd-a: 每天兩次
          5)'.'yyyy-MM-dd-HH: 每小時(shí)
          6)'.'yyyy-MM-dd-HH-mm: 每分鐘
          5.PatternLayout 選項(xiàng)
          ConversionPattern=%m%n :指定怎樣格式化指定的消息。
          6.HTMLLayout 選項(xiàng)
          LocationInfo=true:默認(rèn)值是false,輸出java文件名稱和行號(hào)
          Title=my app file: 默認(rèn)值是 Log4J Log Messages.
          7.XMLLayout 選項(xiàng)
          LocationInfo=true:默認(rèn)值是false,輸出java文件和行號(hào)

          第六部分 Log4j配置案例解析
          #log4j.debug=true
          #log4j.disable=fatal
          #log4j.additivity.TestLogging=false

          log4j.rootCategory=, dest1
          log4j.category.TestLogging=DEBUG, dest1
          log4j.appender.dest1=org.apache.log4j.ConsoleAppender
          #log4j.appender.dest1.layout=org.apache.log4j.SimpleLayout
          log4j.appender.dest1.layout=org.apache.log4j.PatternLayout
          #log4j.appender.dest1.layout.ConversionPattern=%-5p %l %x: %m%n


          !----------------------####### END OF PROPERTIES #######----------------------!


          ##############################################################
          # Below I document in more detail how to write a log4j configuration file. #
          # SELECTIVELY copy lines beginning with #, paste and uncomment them above. #
          ##############################################################

          !-----------------------------------------------------------------------------!
          ! PLACE THIS FILE ANYWHERE IN CLASSPATH !
          ! Appenders are additive by default. !
          ! Priorities are inherited until overridden in a category. !
          ! In ${property_key}, the value of the key can be defined as a system !
          ! property or in this file itself. System properties are searched first and !
          ! then this file. !
          !-----------------------------------------------------------------------------!



          !-----------------------------------------------------------------------------!
          ! Configure log4j's operation at the meta level !
          !-----------------------------------------------------------------------------!
          ! Observe log4j parsing this file
          #log4j.debug=true
          ! Set this to false for log4j to actually obey the log4j.disable property(next)
          #log4j.disableOverride=false
          ! Disable all logging in all categories for messages with priority equal to
          ! or lower than the one given here
          #log4j.disable=INFO



          !-----------------------------------------------------------------------------!
          ! Configure categories (loggers) !
          !-----------------------------------------------------------------------------!

          ! ROOT CATEGORY (Usually sufficient to set this one only)
          ! Here, logs messages with priority DEBUG (default) or higher
          #log4j.rootCategory=, dest1
          ! Or,
          #log4j.rootCategory=debug, dest1, dest2

          ! YOUR CATEGORIES (to customize logging per class/pkg/project/etc)
          ! Here, overrides ancestor's priority and makes it WARN or higher for this cat.
          #log4j.category.TestLogging=WARN, dest3
          ! Or,
          #log4j.category.TestLogging=DEBUG, dest3

          !--------DON'T DO THIS!!! APPENDERS ARE ADDITIVE BY DEFAULT!!!----!
          ! It will write the same log message TWICE to dest1. Once for root, then for !
          ! this category. !
          !#log4j.category.TestLogging=DEBUG, dest1, dest3 !
          ! If you DO NOT want additivity for this category, say so !
          !#log4j.additivity.TestLogging=false !
          !-----------------------------------------------------------------------------!



          !-----------------------------------------------------------------------------!
          ! Configure appenders (log destinations/targets) and their options !
          !-----------------------------------------------------------------------------!

          ! WRITE TO CONSOLE (stdout or stderr)
          #log4j.appender.dest1=org.apache.log4j.ConsoleAppender
          #log4j.appender.dest1.ImmediateFlush=true

          ! WRITE LOG TO A FILE, ROLL THE FILE AFTER SOME SIZE
          #log4j.appender.dest2=org.apache.log4j.RollingFileAppender
          ! This appender will only log messages with priority equal to or higher than
          ! the one specified here
          #log4j.appender.dest2.Threshold=ERROR
          ! Specify the file name (${property_key} gets substituted with its value)
          #log4j.appender.dest2.File=${java.home}/log4j.log
          ! Don't append, overwrite
          #log4j.appender.dest2.Append=false
          ! Control the maximum log file size
          #log4j.appender.dest2.MaxFileSize=100KB
          ! Keep backup file(s) (backups will be in filename.1, .2 etc.)
          #log4j.appender.dest2.MaxBackupIndex=2

          ! WRITE LOG TO A FILE, ROLL THE FILE EVERY WEEK
          #log4j.appender.dest3=org.apache.log4j.DailyRollingFileAppender
          ! Specify the file name
          #log4j.appender.dest3.File=log4TestLogging2.html
          ! Control the maximum log file size
          #log4j.appender.dest3.MaxFileSize=300KB
          ! Rollover log file at the start of each week
          #log4j.appender.dest3.DatePattern='.'yyyy-ww



          !-----------------------------------------------------------------------------!
          ! Configure appender layouts (log formats) and their options !
          !-----------------------------------------------------------------------------!

          ! USE SIMPLE LOG FORMAT (e.g. INFO - your log message)
          #log4j.appender.dest1.layout=org.apache.log4j.SimpleLayout

          ! USE A C PRINTF STYLE PATTERN TO FORMAT LOG MESSAGE
          #log4j.appender.dest1.layout=org.apache.log4j.PatternLayout
          ! For a pattern layout, specify the pattern (Default is %m%n which is fastest)
          #log4j.appender.dest1.layout.ConversionPattern=%-5p: %m%n
          ! Or,
          #log4j.appender.dest1.layout.ConversionPattern=%-5p %6.10r[%t]%x(%F:%L) - %m%n

          #log4j.appender.dest2.layout=org.apache.log4j.PatternLayout
          #log4j.appender.dest2.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x(%F:%L) - %m%n
          ! Or, (the pattern below will slow down your app)
          #log4j.appender.dest2.layout.ConversionPattern=[%d{yyyy-mm-dd hh:mm},%6.6r]%-5p[%t]%x(%F:%L) - %m%n


          ! FORMAT LOG MESSAGES IN THE FORM OF AN HTML TABLE
          #log4j.appender.dest3.layout=org.apache.log4j.HTMLLayout
          ! Include Java file name and line number (Default is false)
          #log4j.appender.dest3.layout.LocationInfo=true
          ! Set
          posted on 2007-10-18 09:39 Endless 閱讀(376) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 辽阳市| 罗平县| 郓城县| 鄂托克前旗| 景宁| 连山| 苏尼特左旗| 育儿| 雅安市| 呼图壁县| 武隆县| 永川市| 长武县| 九寨沟县| 砚山县| 天门市| 镇平县| 南宫市| 平陆县| 凯里市| 凤阳县| 肃南| 平度市| 辽中县| 呈贡县| 杭锦旗| 德昌县| 饶阳县| 合川市| 长治县| 大足县| 拉萨市| 洛隆县| 尉犁县| 慈溪市| 安溪县| 阳江市| 九江县| 汝阳县| 平舆县| 安西县|