'JSON'에 해당되는 글 12건

  1. 2022.03.16 [Logback] JsonLayout, PatternLayout
  2. 2021.11.25 [Elasticsearch] LowLevelRestClient 를 이용한 개발 시 Json 결과 처리
  3. 2021.10.27 [Kibana] Discover 에서 데이터 요청 시 _source 와 fields
  4. 2021.10.06 [Elasticsearch] Date Format & Logback Timestamp Format
  5. 2021.10.05 [Logback] JSON Layout Format 적용하기.
  6. 2020.08.04 [JSON] JSON.parse(), JSON.stringify()
  7. 2020.05.21 [Ace] ace editor json beautify 하기
  8. 2020.05.11 [Beats] Filebeat 내 JSON 처리.
  9. 2019.11.04 [Logstash] JSON filter plugin
  10. 2016.07.21 [MySQL] JSON Type 사용하기

[Logback] JsonLayout, PatternLayout

ITWeb/개발일반 2022. 3. 16. 15:52
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
        <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</timestampFormat>
        <timestampFormatTimezoneId>Asia/Seoul</timestampFormatTimezoneId>
        <appendLineSeparator>true</appendLineSeparator>
        <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
          <prettyPrint>true</prettyPrint>
        </jsonFormatter>
      </layout>
    </encoder>
  </appender>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>%d{HH:mm} %-5level %logger{36} - %msg%n</Pattern>
    </layout>
  </appender>
  
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/file.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>logs/file-%d{yyyy-MM-dd}.log</fileNamePattern>
      <maxHistory>30</maxHistory>
    </rollingPolicy>

    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
        <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</timestampFormat>
        <timestampFormatTimezoneId>Asia/Seoul</timestampFormatTimezoneId>
        <appendLineSeparator>true</appendLineSeparator>
        <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
          <prettyPrint>true</prettyPrint>
        </jsonFormatter>
      </layout>
    </encoder>
  </appender>
  
  ...중략...
  
  </configuration>

필요한 부분에 대해서만 기록해 봅니다. 

appender !!

 

:

[Elasticsearch] LowLevelRestClient 를 이용한 개발 시 Json 결과 처리

Elastic/Elasticsearch 2021. 11. 25. 14:08

보통 Elasticsearch LLRC 를 이용해서 RESTful API 요청 하게 되면
...중략...
Request request = new Request(...중략...);
Response response = esClient.getRestClient().performRequest(request);
String body = EntityUtils.toString(response.getEntity());
...중략...

String 으로 결과를 받아서 리턴 하게 되는데 이 과정에서 JSON String 변환 시 slash 가 추가 되는 불편함이 있을 수 있습니다.
이걸 해소 하려면
...중략...
String body = EntityUtils.toString(response.getEntity());
JsonNode jsonNode = ObjectMapper.readTree(body);
...중략...
readTree 해서 JsonNode Object 로 변환 한 후 처리 하시면 {}, [] 등 모두 깔끔하게 처리가 가능 합니다.

 

ASIS)

{
	"response": "{ \"alias\": \"henry\" }"
}

{
	"response": "[
    	{ \"alias1\": \"henry\" },
        { \"alias2\": \"jeong\" }
      ]"
}

 

TOBE)

{
	"response": { "alias": "henry" }
}

{
	"response": [
    	{ "alias1": "henry" },
        { "alias2": "jeong" }
      ]
}

 

:

[Kibana] Discover 에서 데이터 요청 시 _source 와 fields

Elastic/Kibana 2021. 10. 27. 09:35

Kibana Discover 에서 데이터 요청 시 _source 는 false 로 가져 오지 않습니다.
다만, View 형식을 Table 에서 JSON 으로 변경 시 _source:true 로 데이터를 가져 오게 됩니다.
그렇기 때문에 기본 fields 를 이용해서 문서의 field 를 가져 오게 됩니다.

 

이걸 기록 하는 이유는 

log file ->

filebeat input log -> filebeat processors decode_json_fields -> filebeat output logstash ->

logstash input beat -> logstash output elasticsearch -> logstash output elasticsearch codec json -> 

elasticsearch ->

kibana

이 과정에서 kibana 에서 불필요한 데이터 요청을 하는 것 같아 확인을 해보니 Table 뷰와 JSON 뷰가 다르다는 걸 확인한 결과를 기록 한 부분 입니다.

 

기본 요청은 _source:false 이기 때문에 불필요한 요청을 하지 않습니다.

 

불필요한 요청이라고 하는 이유는 fields 는 _source 에서 정보를 가져오기 때문에 중복입니다.
:

[Elasticsearch] Date Format & Logback Timestamp Format

Elastic/Elasticsearch 2021. 10. 6. 12:18

Elasticsearch 에서 data field 를 이용해서 range 질의를 하기 위해서는 format 을 잘 맞춰 줘야 합니다.

Springboot 로 개발 한 WAS 에서 로그를 JSON 으로 찍으면서 timestamp 값에 대한 format 기 위한 설정에 대해서 기록 합니다.

 

참고문서)

https://www.elastic.co/guide/en/elasticsearch/reference/current/date.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html
http://logback.qos.ch/manual/layouts.html

 

Logback Timestamp Format & JSON 설정)

https://jjeong.tistory.com/1570

  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
        <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</timestampFormat>
        <timestampFormatTimezoneId>Asia/Seoul</timestampFormatTimezoneId>
        <appendLineSeparator>true</appendLineSeparator>
        <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
          <prettyPrint>true</prettyPrint>
        </jsonFormatter>
      </layout>
    </encoder>
  </appender>

 

Timestamp Formet Index)

{
  "mappings": {
    "properties": {
      "timestamp": {
        "type":   "date",
        "format": "strict_date_optional_time||epoch_millis",
        "ignore_malformed": true
      }
    }
  }
}

위 foramt 설정은 별도로 하지 않아도 기본 설정 됩니다.

 

Document Put)

{
    "timestamp" : "2021-10-06T11:33:46.855Z"
}

Range Query )

[Case 1]
{
    "query": {
        "range" : {
            "ts": {
                "gte": "2021-10-06T11:33:36.000Z",
                "lte": "2021-10-06T11:34:38.000Z"
            }
        }
    }
}

[Case 2]
{
    "query": {
        "range" : {
            "ts": {
                "gte": "2021-10-06 11:33:36.000",
                "lte": "2021-10-06 11:34:38.000",
                "format": "yyyy-MM-dd HH:mm:ss.SSS"
            }
        }
    }
}

결국 입력 값이 정확 하면 질의 시 format 을 지정해서 편하게 검색이 가능 합니다.

 

:

[Logback] JSON Layout Format 적용하기.

ITWeb/개발일반 2021. 10. 5. 18:52

Springboot 로 프로젝트 생성 후 로깅 하면서 로그 포멧을 JSON 으로 적용 하기 위한 내용을 기억 차원에서 작성 합니다.

 

[logback.xml]

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
        <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</timestampFormat>
        <timestampFormatTimezoneId>Asia/Seoul</timestampFormatTimezoneId>
        <appendLineSeparator>true</appendLineSeparator>
        <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
          <prettyPrint>true</prettyPrint>
        </jsonFormatter>
      </layout>
    </encoder>
  </appender>

  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>application/application.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>application/application-%d{yyyy-MM-dd}.log</fileNamePattern>
      <maxHistory>30</maxHistory>
    </rollingPolicy>

    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
        <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</timestampFormat>
        <timestampFormatTimezoneId>Asia/Seoul</timestampFormatTimezoneId>
        <appendLineSeparator>true</appendLineSeparator>
        <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
          <prettyPrint>true</prettyPrint>
        </jsonFormatter>
      </layout>
    </encoder>
  </appender>

  <logger name="org.springframework" level="error" additivity="false" />
  <logger name="org.apache" level="error" additivity="false" />
  <logger name="com.zaxxer" level="error" additivity="false" />
  <logger name="io.netty" level="error" additivity="false" />
  <logger name="reactor" level="error" additivity="false" />
  <logger name="com.xxxxx" level="debug" additivity="false">
    <appender-ref ref="FILE" />
  </logger>

  <root level="debug">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
  </root>
</configuration>

 

[build.gradle]

compile "ch.qos.logback.contrib:logback-jackson:${props.getProperty('logback-jackson')}"
compile "ch.qos.logback.contrib:logback-json-classic:${props.getProperty('logback-json-classic')}"

- 여기서 사용 버전은 0.1.5 입니다.

 

사용한 timezone 은 ETC/UTC 가 아닌 Asia/Seoul 로 설정 했습니다.

:

[JSON] JSON.parse(), JSON.stringify()

ITWeb/개발일반 2020. 8. 4. 16:49

[참고문서]

https://www.w3schools.com/js/js_json_parse.asp

https://www.w3schools.com/js/js_json_stringify.asp

 

String to JSON Object)

JSON_OBJECT = JSON.parse("JSON String");

 

JSON Object to String)

JSON_STRING = JSON.stringify(JSON_OBJECT);

 

:

[Ace] ace editor json beautify 하기

ITWeb/개발일반 2020. 5. 21. 10:23

참고문서)

https://ace.c9.io/#nav=howto

 

필요한 JS 파일) 필요한 resource 모두 받아 두었습니다.

<script src="/statics/js/ace/ace.js"></script>
<script src="/statics/js/ace/ext-beautify.js"></script>

 

Editor DIV)

<div id="shadowStateEditor" style="width:100%; height:300px;">
{
  "state": {
    "reported": {
      "welcome": "Ace World"
    }
  }
}
</div>

 

Javascript) 설정 및 적용

// res.data 는 ajax 처리 후 success 에서 넘겨 받은 json 데이터 입니다.

ace.edit("shadowStateEditor").setValue(
  JSON.stringify(
    JSON.parse(res.data), null, 2
  )
);

drawShadowStateEditor();

function drawShadowStateEditor(){
  var beautify = ace.require("ace/ext/beautify");
  var editor = ace.edit("shadowStateEditor");

  editor.setTheme("ace/theme/nord_dark");
  editor.session.setMode("ace/mode/json");
  editor.setShowInvisibles(false);
  editor.setReadOnly(true);
  editor.setShowPrintMargin(false);
  editor.session.setTabSize(2);
  editor.session.setUseSoftTabs(true);
  editor.session.setUseWrapMode(true);

  beautify.beautify(editor.session);

  editor.resize();
}

 

:

[Beats] Filebeat 내 JSON 처리.

Elastic/Beats 2020. 5. 11. 14:18

1. input type log 에서 처리 하는 방법과

2. processor 에서 decode_json_fields 로 처리 하는 방법이 있습니다.

 

1번은 그냥 전체 로그에 대해서 처리

2번은 특정 필드의 메시지에 대해서 처리

 

자세한건 문서를 참고해 주세요.

 

[Reference]

https://www.elastic.co/guide/en/beats/filebeat/7.6/filebeat-input-log.html

https://www.elastic.co/guide/en/beats/filebeat/7.6/decode-json-fields.html

 

:

[Logstash] JSON filter plugin

Elastic/Logstash 2019. 11. 4. 14:16

공홈에 올라와 있는 문서의 번역 본 정도로 정리를 해보려고 합니다.

별거 아니지만 JSON filter 를 많이 사용하면서 Validation 에 대한 인식이 부족해서 오류를 발생 시키는 경우가 꽤 많이 있습니다.

기억력을 돕기 위해 작성해 봅니다.

 

공식문서)

https://www.elastic.co/guide/en/logstash/current/plugins-filters-json.html

 

이 내용은 logstash reference 문서 내 filter 항목에 해당 합니다.

용도는 말 그대로 입니다. JSON  parsing 을 하는 filter 입니다.

 

여기서 문제가 들어 오는 JSON 데이터가 항상 validate 할 거라고 생각 하고 구현 하시는 분들이 계시는데 이 부분이 문제가 됩니다.

기본 이라고 생각 하지만 validation 에 대한 개발자의 생각과 경험이 요즘은 다른 것 같더라구요.

 

암튼, 그래서 JSON filter 사용 시 제공하는 Option 에 대해서 숙지 하고 사용하시면 좋겠습니다.

기본적으로는 Common Options 를 먼저 보시는게 좋습니다.

 

JSON Filter Configuration Options)

Setting Input type Required
skip_on_invalid_json boolean No
source string Yes
tag_on_failure array No
target string No
  • skip_on_invalid_json
    json 이 아닌 데이터가 들어 올 경우 에러를 발생 시키지 않고 skip 시키기 위한 옵션 입니다.
    기본 설정 값이 false 이기 때문에 잘 못된 데이터에 대해서 오류가 발생 하게 됩니다.

  • source
    json parsing 을 하기 위한 field 를 지정 하게 됩니다.

  • tag_on_failure
    정상적으로 처리 되지 않았을 경우 tags 라는 filed 에 "_jsonparsefailure" 값이 추가 됩니다.

  •  target
    source field 내 json value 가 target filed 로 등록 되며, 이미 target field 가 있다면 overwrite 됩니다.

위 설정 중에서 skip_on_invalid_json  과 tag_on_failure 만 잘 설정 하셔도 invalid data 에 대한 오류는 잘 넘길 수 있습니다.

간혹 이 오류로 인해서 logstash 가 먹통이 되는 걸 예방 할 수 있기 때문 입니다.

:

[MySQL] JSON Type 사용하기

ITWeb/개발일반 2016. 7. 21. 10:12

elasticsearch에서 문서 데이터를 처리 하다 보니 json format을 많이 사용하게 됩니다.

그래서 색인을 위한 데이터중 일부는 mysql 에 json 형태로 저장할 필요가 있는데요. mysql 5.7 부터 data type 으로 json 을 지원하고 있습니다.


참고문서)

https://dev.mysql.com/doc/refman/5.7/en/json.html

https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html


선언)

CREATE TABLE XXXX (

    seq BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,

    doc JSON NOT NULL,

    PRIMARY KEY (seq)

) ENGINE = InnoDB

CHARACTER SET utf8

COLLATE utf8_general_ci;


등록)

INSERT INTO XXXX(doc) VALUE (?)



조회)

SELECT doc

FROM XXXX


JDBC)

# 등록

PrepareStatement.setObject(1, OBJECT);


# 조회

ResultSet.getObjecrt(1, "doc");

- JDBC 를 통해 DB 에 등록 할 때 value 값에 대한 Object를 Array 인지 Object 인지 확인해서 넣어 주어야 값이 원하는 형태로 저장 됩니다.


Elasticsearch Mapping)

"FIELD_NAME": { "type":"object", "enabled":false }


: