最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

elasticsearch+logstash并使用java代碼實(shí)現(xiàn)日志檢索

 更新時(shí)間:2021年02月22日 09:42:41   作者:qq_41175749  
這篇文章主要介紹了elasticsearch+logstash并使用java代碼實(shí)現(xiàn)日志檢索,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

為了項(xiàng)目日志不被泄露,數(shù)據(jù)展示不采用Kibana

1、環(huán)境準(zhǔn)備

1.1 創(chuàng)建普通用戶

#創(chuàng)建用戶
useradd querylog

#設(shè)置密碼
passwd queylog

#授權(quán)sudo權(quán)限
查找sudoers文件位置 
whereis sudoers
#修改文件為可編輯 
chmod -v u+w /etc/sudoers
#編輯文件
vi /etc/sudoers
#收回權(quán)限
chmod -v u-w /etc/sudoers
#第一次使用sudo會(huì)有提示

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

 #1) Respect the privacy of others.
 #2) Think before you type.
 #3) With great power comes great responsibility.

用戶創(chuàng)建完成。

1.2 安裝jdk

su queylog
cd /home/queylog
#解壓jdk-8u191-linux-x64.tar.gz 
tar -zxvf jdk-8u191-linux-x64.tar.gz 
sudo mv jdk1.8.0_191 /opt/jdk1.8
#編輯/ect/profile
vi /ect/profile
export JAVA_HOME=/opt/jdk1.8
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
#刷新配置文件
source /ect/profile
#查看jdk版本
java -verion

1.3 防火墻設(shè)置

#放行指定IP
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.16.110.55" accept" 
#重新載入
firewall-cmd --reload

2、安裝elasticsearch

2.1 elasticsearch配置

注意:elasticsearch要使用普通用戶啟動(dòng)要不然會(huì)報(bào)錯(cuò)

su queylog
cd /home/queylog
#解壓elasticsearch-6.5.4.tar.gz
tar -zxvf elasticsearch-6.5.4.tar.gz
sudo mv elasticsearch-6.5.4 /opt/elasticsearch
#編輯es配置文件
vi /opt/elasticsearch/config/elasticsearch.yml 
# 配置es的集群名稱
cluster.name: elastic
# 修改服務(wù)地址
network.host: 192.168.8.224
# 修改服務(wù)端口
http.port: 9200

#切換root用戶
su root
#修改/etc/security/limits.conf 追加以下內(nèi)容
vi /etc/security/limits.conf
* hard nofile 655360
* soft nofile 131072
* hard nproc 4096
* soft nproc 2048

#編輯 /etc/sysctl.conf,追加以下內(nèi)容:
vi /etc/sysctl.conf
vm.max_map_count=655360
fs.file-max=655360

#保存后,重新加載:
sysctl -p

#切換回普通用戶
su queylog
#啟動(dòng)elasticsearch
./opt/elasticsearch/bin/elasticsearch
#測(cè)試
curl http://192.168.8.224:9200
#控制臺(tái)會(huì)打印
{
 "name" : "L_dA6oi",
 "cluster_name" : "elasticsearch",
 "cluster_uuid" : "eS7yP6fVTvC8KMhLutOz6w",
 "version" : {
 "number" : "6.5.4",
 "build_flavor" : "default",
 "build_type" : "tar",
 "build_hash" : "d2ef93d",
 "build_date" : "2018-12-17T21:17:40.758843Z",
 "build_snapshot" : false,
 "lucene_version" : "7.5.0",
 "minimum_wire_compatibility_version" : "5.6.0",
 "minimum_index_compatibility_version" : "5.0.0"
 },
 "tagline" : "You Know, for Search"
}

2.2 把elasticsearch作為服務(wù)進(jìn)行管理

#切換root用戶
su root
#編寫服務(wù)配置文件
vi /usr/lib/systemd/system/elasticsearch.service
[unit]
Description=Elasticsearch
Documentation=http://www.elastic.co
Wants=network-online.target
After=network-online.target

[Service]
Environment=ES_HOME=/opt/elasticsearch
Environment=ES_PATH_CONF=/opt/elasticsearch/config
Environment=PID_DIR=/opt/elasticsearch/config
EnvironmentFile=/etc/sysconfig/elasticsearch
WorkingDirectory=/opt/elasticsearch
User=queylog
Group=queylog
ExecStart=/opt/elasticsearch/bin/elasticsearch -p ${PID_DIR}/elasticsearch.pid

# StandardOutput is configured to redirect to journalctl since
# some error messages may be logged in standard output before
# elasticsearch logging system is initialized. Elasticsearch
# stores its logs in /var/log/elasticsearch and does not use
# journalctl by default. If you also want to enable journalctl
# logging, you can simply remove the "quiet" option from ExecStart.
StandardOutput=journal
StandardError=inherit

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536

# Specifies the maximum number of process
LimitNPROC=4096

# Specifies the maximum size of virtual memory
LimitAS=infinity

# Specifies the maximum file size
LimitFSIZE=infinity

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=0

# SIGTERM signal is used to stop the Java process
KillSignal=SIGTERM

# Send the signal only to the JVM rather than its control group
KillMode=process

# Java process is never killed
SendSIGKILL=no

# When a JVM receives a SIGTERM signal it exits with code 143
SuccessExitStatus=143
 
[Install]
WantedBy=multi-user.target


vi /etc/sysconfig/elasticsearch

elasticsearch #
#######################

# Elasticsearch home directory
ES_HOME=/opt/elasticsearch

# Elasticsearch Java path
JAVA_HOME=/home/liyijie/jdk1.8
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOMR/jre/lib

# Elasticsearch configuration directory
ES_PATH_CONF=/opt/elasticsearch/config

# Elasticsearch PID directory
PID_DIR=/opt/elasticsearch/config

#############################
# Elasticsearch Service #
#############################

# SysV init.d
# The number of seconds to wait before checking if elasticsearch started successfully as a daemon process
ES_STARTUP_SLEEP_TIME=5

################################
# Elasticsearch Properties #
################################
# Specifies the maximum file descriptor number that can be opened by this process
# When using Systemd,this setting is ignored and the LimitNOFILE defined in
# /usr/lib/systemd/system/elasticsearch.service takes precedence
#MAX_OPEN_FILES=65536

# The maximum number of bytes of memory that may be locked into RAM
# Set to "unlimited" if you use the 'bootstrap.memory_lock: true' option
# in elasticsearch.yml.
# When using Systemd,LimitMEMLOCK must be set in a unit file such as
# /etc/systemd/system/elasticsearch.service.d/override.conf.
#MAX_LOCKED_MEMORY=unlimited

# Maximum number of VMA(Virtual Memory Areas) a process can own
# When using Systemd,this setting is ignored and the 'vm.max_map_count'
# property is set at boot time in /usr/lib/sysctl.d/elasticsearch.conf
#MAX_MAP_COUNT=262144

# 重新加載服務(wù)
systemctl daemon-reload
#切換普通用戶
su queylog
#啟動(dòng)elasticsearch
sudo systemctl start elasticsearch
#設(shè)置開(kāi)機(jī)自啟動(dòng)
sudo systemctl enable elasticsearch

3、安裝logstash

3.1、logstash配置

su queylog
cd /home/queylog
#解壓 logstash-6.5.4.tar.gz
tar -zxvf logstash-6.5.4.tar.gz
sudo mv logstash-6.5.4 /opt/logstash
#編輯es配置文件
vi /opt/logstash/config/logstash.yml 
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: changeme
xpack.monitoring.elasticsearch.url: ["http://192.168.8.224:9200"]
#在bin目錄下創(chuàng)建logstash.conf
vi /opt/logstash/bin/logstash.conf
input {
# 以文件作為來(lái)源
file {
# 日志文件路徑
path => "/opt/tomcat/logs/catalina.out"
start_position => "beginning" # (end, beginning)
type=> "isp"
}
}
#filter { 
#定義數(shù)據(jù)的格式,正則解析日志(根據(jù)實(shí)際需要對(duì)日志日志過(guò)濾、收集)
#grok {  
# match => { "message" => "%{IPV4:clientIP}|%{GREEDYDATA:request}|%{NUMBER:duration}"}
#}   
#根據(jù)需要對(duì)數(shù)據(jù)的類型轉(zhuǎn)換  
#mutate { convert => { "duration" => "integer" }}
#}
# 定義輸出 
output {
elasticsearch {
hosts => "192.168.43.211:9200" #Elasticsearch 默認(rèn)端口
index => "ind"
document_type => "isp"
} 
} 
#給該用戶授權(quán)
chown queylog:queylog /opt/logstash
#啟動(dòng)logstash
./opt/logstash/bin/logstash -f logstash.conf 

# 安裝并配置啟動(dòng)logstash后查看es索引是否創(chuàng)建完成
curl http://192.168.8.224:9200/_cat/indices

4、java代碼部分

之前在SpringBoot整合ElasticSearch與Redis的異常解決

查閱資料,這個(gè)歸納的原因比較合理。
原因分析:程序的其他地方使用了Netty,這里指redis。這影響在實(shí)例化傳輸客戶端之前初始化處理器的數(shù)量。 實(shí)例化傳輸客戶端時(shí),我們嘗試初始化處理器的數(shù)量。 由于在其他地方使用Netty,因此已經(jīng)初始化并且Netty會(huì)對(duì)此進(jìn)行防范,因此首次實(shí)例化會(huì)因看到的非法狀態(tài)異常而失敗。

解決方案

在SpringBoot啟動(dòng)類中加入:

System.setProperty("es.set.netty.runtime.available.processors", "false");

4.1、引入pom依賴

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  </dependency>

4.2、修改配置文件

spring.data.elasticsearch.cluster-name=elastic
# restapi使用9200
# java程序使用9300
spring.data.elasticsearch.cluster-nodes=192.168.43.211:9300

4.3、對(duì)應(yīng)的接口以及實(shí)現(xiàn)類

import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;

@Document(indexName = "ind", type = "isp")
public class Bean {


 @Field
 private String message;

 public String getMessage() {
  return message;
 }

 public void setMessage(String message) {
  this.message = message;
 }

 @Override
 public String toString() {
  return "Tomcat{" +
    ", message='" + message + '\'' +
    '}';
 }
}
import java.util.Map;
public interface IElasticSearchService {

  Map<String, Object> search(String keywords, Integer currentPage, Integer pageSize) throws Exception ;

	//特殊字符轉(zhuǎn)義
  default String escape( String s) {
  StringBuilder sb = new StringBuilder();

  for(int i = 0; i < s.length(); ++i) {
   char c = s.charAt(i);
   if (c == '\\' || c == '+' || c == '-' || c == '!' || c == '(' || c == ')' || c == ':' || c == '^' || c == '[' || c == ']' || c == '"' || c == '{' || c == '}' || c == '~' || c == '*' || c == '?' || c == '|' || c == '&' || c == '/') {
    sb.append('\\');
   }

   sb.append(c);
  }
  return sb.toString();
 }

}
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * ElasticSearch實(shí)現(xiàn)類
 */
@Service
public class ElasticSearchServiceImpl implements IElasticSearchService {

 Logger log = LoggerFactory.getLogger(ElasticSearchServiceImpl.class);

 @Autowired
 ElasticsearchTemplate elasticsearchTemplate;

 @Resource
 HighlightResultHelper highlightResultHelper;

 @Override
 public Map<String, Object> search(String keywords, Integer currentPage, Integer pageSize) {
  keywords= escape(keywords);
   currentPage = Math.max(currentPage - 1, 0);

  List<HighlightBuilder.Field> highlightFields = new ArrayList<>();
 //設(shè)置高亮 把查詢到的關(guān)鍵字進(jìn)行高亮
  HighlightBuilder.Field message = new HighlightBuilder.Field("message").fragmentOffset(80000).numOfFragments(0).requireFieldMatch(false).preTags("<span style='color:red'>").postTags("</span>");
  highlightFields.add(message);

  HighlightBuilder.Field[] highlightFieldsAry = highlightFields.toArray(new HighlightBuilder
    .Field[highlightFields.size()]);
  
  //創(chuàng)建查詢構(gòu)造器
  NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
  //過(guò)濾 按字段權(quán)重進(jìn)行搜索 查詢內(nèi)容不為空按關(guān)鍵字、摘要、其他屬性權(quán)重
  BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  queryBuilder.withPageable(PageRequest.of(currentPage, pageSize));
  if (!MyStringUtils.isEmpty(keywords)){
   boolQueryBuilder.must(QueryBuilders.queryStringQuery(keywords).field("message"));
  }

  queryBuilder.withQuery(boolQueryBuilder);

  queryBuilder.withHighlightFields(highlightFieldsAry);

  log.info("查詢語(yǔ)句:{}", queryBuilder.build().getQuery().toString());

  //查詢
  AggregatedPage<Bean> result = elasticsearchTemplate.queryForPage(queryBuilder.build(), Bean
    .class,highlightResultHelper);
  //解析結(jié)果
  long total = result.getTotalElements();
  int totalPage = result.getTotalPages();
  List<Bean> blogList = result.getContent();
  Map<String, Object> map = new HashMap<>();
  map.put("total", total);
  map.put("totalPage", totalPage);
  map.put("pageSize", pageSize);
  map.put("currentPage", currentPage + 1);
  map.put("blogList", blogList);
  return map;
 }
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.beanutils.PropertyUtils;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.SearchResultMapper;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

/**
 * ElasticSearch高亮配置
 */
@Component
public class HighlightResultHelper implements SearchResultMapper {

 Logger log = LoggerFactory.getLogger(HighlightResultHelper.class);


 @Override
 public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
  List<T> results = new ArrayList<>();
  for (SearchHit hit : response.getHits()) {
   if (hit != null) {
    T result = null;
    if (StringUtils.hasText(hit.getSourceAsString())) {
     result = JSONObject.parseObject(hit.getSourceAsString(), clazz);
    }
    // 高亮查詢
    for (HighlightField field : hit.getHighlightFields().values()) {
     try {
      PropertyUtils.setProperty(result, field.getName(), concat(field.fragments()));
     } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
      log.error("設(shè)置高亮字段異常:{}", e.getMessage(), e);
     }
    }
    results.add(result);
   }
  }
  return new AggregatedPageImpl<T>(results, pageable, response.getHits().getTotalHits(), response
    .getAggregations(), response.getScrollId());
 }


 public <T> T mapSearchHit(SearchHit searchHit, Class<T> clazz) {
  List<T> results = new ArrayList<>();
  for (HighlightField field : searchHit.getHighlightFields().values()) {
   T result = null;
   if (StringUtils.hasText(searchHit.getSourceAsString())) {
    result = JSONObject.parseObject(searchHit.getSourceAsString(), clazz);
   }
   try {
    PropertyUtils.setProperty(result, field.getName(), concat(field.fragments()));
   } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
    log.error("設(shè)置高亮字段異常:{}", e.getMessage(), e);
   }
   results.add(result);
  }
  return null;
 }

 private String concat(Text[] texts) {
  StringBuffer sb = new StringBuffer();
  for (Text text : texts) {
   sb.append(text.toString());
  }
  return sb.toString();
 }
}
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = CbeiIspApplication.class)
public class ElasticSearchServiceTest {w

 private static Logger logger= LoggerFactory.getLogger(EncodePhoneAndCardTest.class);
 
 @Autowired
 private IElasticSearchService elasticSearchService;

 	@Test
 public ResponseVO getLog(){
  try {
  Map<String, Object> search = elasticSearchService.search("Exception", 1, 10);
   logger.info( JSON.toJSONString(search));
  } catch (Exception e) {
   e.printStackTrace();
  }
}

例如:以上就是今天要講的內(nèi)容,本文僅僅簡(jiǎn)單介紹了elasticsearch跟logstash的使用, 文章若有不當(dāng)之處,歡迎評(píng)論指出~

到此這篇關(guān)于elasticsearch+logstash并使用java代碼實(shí)現(xiàn)日志檢索的文章就介紹到這了,更多相關(guān)elasticsearch logstash日志檢索內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Java回顧之多線程同步的使用詳解

    基于Java回顧之多線程同步的使用詳解

    在這篇文章里,我們關(guān)注線程同步的話題。這是比多線程更復(fù)雜,稍不留意,我們就會(huì)“掉到坑里”,而且和單線程程序不同,多線程的錯(cuò)誤是否每次都出現(xiàn),也是不固定的,這給調(diào)試也帶來(lái)了很大的挑戰(zhàn)
    2013-05-05
  • java對(duì)xml節(jié)點(diǎn)屬性的增刪改查實(shí)現(xiàn)方法

    java對(duì)xml節(jié)點(diǎn)屬性的增刪改查實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇java對(duì)xml節(jié)點(diǎn)屬性的增刪改查實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • Java類的加載連接和初始化實(shí)例分析

    Java類的加載連接和初始化實(shí)例分析

    這篇文章主要介紹了Java類的加載連接和初始化,結(jié)合具體實(shí)例形式分析了java類的加載、連接、初始化相關(guān)原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07
  • json-lib將json格式的字符串,轉(zhuǎn)化為java對(duì)象的實(shí)例

    json-lib將json格式的字符串,轉(zhuǎn)化為java對(duì)象的實(shí)例

    下面小編就為大家?guī)?lái)一篇json-lib將json格式的字符串,轉(zhuǎn)化為java對(duì)象的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • Druid關(guān)閉監(jiān)控頁(yè)面關(guān)閉不了的問(wèn)題及解決

    Druid關(guān)閉監(jiān)控頁(yè)面關(guān)閉不了的問(wèn)題及解決

    這篇文章主要介紹了Druid關(guān)閉監(jiān)控頁(yè)面關(guān)閉不了的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • SpringBoot如何使用Scala進(jìn)行開(kāi)發(fā)的實(shí)現(xiàn)

    SpringBoot如何使用Scala進(jìn)行開(kāi)發(fā)的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot如何使用Scala進(jìn)行開(kāi)發(fā)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • springboot如何去除debug日志

    springboot如何去除debug日志

    這篇文章主要介紹了springboot如何去除debug日志的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • java中int、double、char等變量的取值范圍詳析

    java中int、double、char等變量的取值范圍詳析

    這篇文章主要給大家介紹了關(guān)于java中int、double、char等變量取值范圍的相關(guān)資料,每個(gè)變量都給出了詳細(xì)的實(shí)例代碼,對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-10-10
  • 解讀Mapper與Mapper.xml文件之間匹配的問(wèn)題

    解讀Mapper與Mapper.xml文件之間匹配的問(wèn)題

    這篇文章主要介紹了解讀Mapper與Mapper.xml文件之間匹配的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • JAVA中數(shù)組插入與刪除指定元素的實(shí)例代碼

    JAVA中數(shù)組插入與刪除指定元素的實(shí)例代碼

    下面小編就為大家分享一篇JAVA中數(shù)組插入與刪除指定元素的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02

最新評(píng)論

固阳县| 山阴县| 阳城县| 新民市| 仁化县| 隆昌县| 沁水县| 潞城市| 固安县| 定远县| 乳山市| 喀喇| 赫章县| 大埔区| 凌云县| 衡水市| 武强县| 乐陵市| 右玉县| 寿光市| 北票市| 遂宁市| 临清市| 交城县| 鱼台县| 邢台市| 诏安县| 鹤庆县| 五指山市| 公主岭市| 新营市| 嘉荫县| 日土县| 锡林郭勒盟| 嘉峪关市| 贵溪市| 团风县| 云龙县| 东港市| 宽甸| 雅安市|