Elasticsearchでのログの公開-正規表現とlogstashのない生活



このソリューションのアプローチを使用する場合、ファイルの解析は必要ありません。 ロギング形式または新しいメッセージの外観を変更する場合、多数のレギュラーをサポートする必要はありません。 ロガーのエラー、警告、情報、デバッグ、トレースメソッドの呼び出しをインターセプトし、すぐにデータをelasticsearchに送信します。 これにより、アスペクト指向プログラミングが役立ちます!



記事の最後でスクリーンキャストを見ることができます。



スクリプトおよび設定の側面を使用して、elasticsearchクライアント、gsonシリアライザー、およびjvmのインターセプトされたメソッドのパラメーターを操作する方法を学習していただければ幸いです。



SonarQubeは、 hawt.io / h2jdbcロギングCRaSH-sshに関する記事のように、実験的なプログラムのままです。 hawt.io/h2に関する出版物で、ソナーと仮想マシンエージェントのインストールと構成の詳細を読むことができます。



今回は、jvmソナー起動オプションを使用します。

sonar.web.javaAdditionalOpts = -javaagent: aspectj-scripting-1.0-agent.jar -Dorg.aspectj.weaver.loadtime.configuration = config:ファイル: es.xml

サンプルを機能させるには、jvmエージェントのaspectj-scriptingおよびes.xml構成ファイルをダウンロードする必要があります。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <configuration> <aspects> <name>com.github.igorsuhorukov.Loging</name> <type>AROUND</type> <pointcut>call(* org.slf4j.Logger.error(..)) || call(* org.slf4j.Logger.warn(..)) || call(* org.slf4j.Logger.info(..)) || call(* org.slf4j.Logger.debug(..)) || call(* org.slf4j.Logger.trace(..))</pointcut> <process> <expression> res = joinPoint.proceed(); log = new java.util.HashMap(); log.put("level", joinPoint.getSignature().getName()); log.put("srcf", joinPoint.getSourceLocation().getFileName().substring(0, joinPoint.getSourceLocation().getFileName().length()-5)); log.put("srcl", joinPoint.getSourceLocation().getLine()); if(joinPoint.getArgs()!=null && joinPoint.getArgs().?length>0){ log.put("message", joinPoint.getArgs()[0].?toString()); if(joinPoint.getArgs().length > 1){ params = new java.util.HashMap(); for(i=1; i < joinPoint.getArgs().length;i++){ if(joinPoint.getArgs()[i]!=null){ if(joinPoint.getArgs()[i].class.getName().equals("[Ljava.lang.Object;")){ for(j=0; j < joinPoint.getArgs()[i].length;j++){ if( (joinPoint.getArgs()[i])[j] !=null){ params.put(i+"."+j,(joinPoint.getArgs()[i])[j].toString()); } } } else { params.put(i,joinPoint.getArgs()[i].toString()); } } } log.put("params", params); } } log.put("host", reportHost); log.put("pid", pid); log.put("@version", 1); localDate = new java.util.Date(); lock.lock(); log.put("@timestamp", dateFormat.format(localDate)); index = "logstash-" + logstashFormat.format(localDate); lock.unlock(); logSource = gson.toJson(log); client.index(client.prepareIndex(index, "logs").setSource(logSource).request()); res; </expression></process> </aspects> <globalContext> <artifacts> <artifact>com.google.code.gson:gson:2.3.1</artifact> <classRefs> <variable>GsonBuilder</variable> <className>com.google.gson.GsonBuilder</className> </classRefs> </artifacts> <artifacts> <artifact>org.elasticsearch:elasticsearch:1.1.1</artifact> <classRefs> <variable>NodeBuilder</variable> <className>org.elasticsearch.node.NodeBuilder</className> </classRefs> </artifacts> <init> <expression> import java.text.SimpleDateFormat; import java.util.TimeZone; import java.util.concurrent.locks.ReentrantLock; reportHost = java.net.InetAddress.getLocalHost().getHostName(); pid = java.lang.management.ManagementFactory.getRuntimeMXBean().getName().split("@")[0]; gson = new GsonBuilder().create(); dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); logstashFormat = new SimpleDateFormat("yyyy.MM.dd"); logstashFormat.setTimeZone(TimeZone.getTimeZone("UTC")); lock = new ReentrantLock(); client = NodeBuilder.nodeBuilder().clusterName("distributed_app").data(false).client(true).build().client(); </expression> </init> </globalContext> </configuration>
      
      







org.slf4j.Loggerインターフェースのプログラムエラー、警告、情報、デバッグ、トレースメソッドからのすべてのコールポイントについて、HashMapログを作成し、コールコンテキストパラメーターで埋めるアスペクトが呼び出されます:クラス「srcf」のファイルとその中の行「srcl」 、ロギングレベル「レベル」 、ホスト名「ホスト」 、プロセス識別子「pid」 、ロガーの呼び出し時間「@timestamp」 、メッセージテキストテンプレートを指定し、そのパラメーターをマップ「params」に個別に保存します。 これはすべて、呼び出しと同期してjsonでシリアル化され、 「logstash-」という名前と呼び出しの日付でインデックスに送信されます。 日付と時刻をフォーマットするクラス、およびelasticsearchのクライアントは、アプリケーションの起動時にglobalContextアスペクトのグローバル初期化ブロックで作成されます。

elasticsearchクラスは、 org.elasticsearch:elasticsearch:1.1.1座標のmavenリポジトリーから、 com.google.code.gson:gson:2.3.1座標のシリアライザー jsonからロードされます。

アスペクトからのクライアントは、マルチキャストプロトコル経由で起動するときに、 「distributed_app」という名前のelasticsearchクラスターを見つけようとしています



クライアントを起動する前に、必ず1つのプロセスで構成されるelasticsearchサーバークラスターを起動してください。



 package org.github.suhorukov; import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.node.Node; import org.elasticsearch.node.NodeBuilder; import java.io.InputStream; import java.net.URL; import java.util.concurrent.TimeUnit; public class ElasticsearchServer { public static void main(String[] args) throws Exception{ String template; try(InputStream templateStream = new URL("https://raw.githubusercontent.com/logstash-plugins/logstash-output-elasticsearch/master/lib/logstash/outputs/elasticsearch/elasticsearch-template.json").openStream()){ template = new String(sun.misc.IOUtils.readFully(templateStream, -1, true)); } Node elasticsearchServer = NodeBuilder.nodeBuilder().settings(ImmutableSettings.settingsBuilder().put("http.cors.enabled","true")).clusterName("distributed_app").data(true).build(); Node node = elasticsearchServer.start(); node.client().admin().indices().preparePutTemplate("logstash").setSource(template).get(); Thread.sleep(TimeUnit.HOURS.toMillis(5)); } }
      
      





このクラスをコンパイルして実行するには、依存関係が必要です。

  <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>1.1.1</version> </dependency>
      
      







ログを表示するには、古いkibana 3.1.3ビルドをダウンロードします。これはWebサーバーがなくても機能します。 config.jsファイルを編集します
 elasticsearch: "http://127.0.0.1:9200"
      
      



kibanaがelasticsearchサーバーに接続できるように(このために"http.cors.enabled" = trueを指定しました)



ソナーを起動する

 ./bin/linux-x86-64/sonar.sh start
      
      





そして、このシステムのkibanaイベントでSonarQubeの動作中にブラウザでどのように表示されるかを観察します







アスペクトの使用例に興味がありますか? 提案する!



All Articles