log4j2 RedisAppender

How to implement log4j2 redis appender

1.Download a RedisAppender Class

2.log4j2.xml

<Configuration>
    <Appenders>
<Console name="Console" target="SYSTEM_OUT">
            <PatternLayout
                    pattern="%style{%d{ISO8601}}{black} %highlight{%-5level }[%style{%t}{bright,blue}] %style{%C{1.}}{bright,yellow}: %msg%n%throwable" />
        </Console>
<Async name="AsyncAppenderRedis" bufferSize="80">
            <AppenderRef ref="REDIS"/>
        </Async>
<RedisAppender name="REDIS"
                       key="log4j2-messages"
                       host="redis_ip"
                       port="redis_port">
            <PatternLayout pattern="%level %msg"/>
            <RedisConnectionPoolConfig testWhileIdle="true"
                                       minEvictableIdleTimeMillis="60000"
                                       timeBetweenEvictionRunsMillis="30000"
                                       numTestsPerEvictionRun="-1"/>
            <RedisThrottlerConfig bufferSize="500"
                                  batchSize="100"
                                  flushPeriodMillis="1000"
                                  maxEventCountPerSecond="100"
                                  maxByteCountPerSecond="4194304"/>
        </RedisAppender>
</Appenders>

    <Loggers>
        <!-- LOG everything at INFO level -->
        <Root level="info">
            <AppenderRef ref="AsyncAppenderRedis" />
            <AppenderRef ref="Console" />
        </Root>

        <!-- LOG "myapp" at TRACE level -->
        <Logger name="myapp" level="trace"></Logger>
    </Loggers>

</Configuration>

ทุกครั้งที่ใน App เรามีการใช้คำสั่งเช่น logger.info(“message”); ข้อมูลจะถูกส่งไปเก็บที่ Redis โดยจะใช้คำสั่ง rpush เก็บเป็น Queue เราสามารถลอง rpop ตาม key ที่ระบุใน log4j2.xml ในตัวอย่างคือ log4j2-messages

Ref : https://github.com/vy/log4j2-redis-appender

Posted in spring boot | Leave a comment

PKCE Proof Key for Code Exchange (RFC 7636)

ยืนยันเจ้าของการ Request OAuth2.0 grant_type authorization_code ด้วยค่า code_challenge และ code_verifier เนื่องจาก Browser อาจโดนไวรัสผู้ไม่ประสงค์ที่อาจจะทำให้มัน Hack Access Token ได้

เพิ่มเติมจาก Flow เดิมดังนี้
1.Authorization Request => client ส่งค่า code_challenge มาเพิ่มโดยเข้ารหัส
code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))
2.Auth Server => เก็บค่า code_challenge ลง db
3.Token Request => client ส่งค่า code_verifier เป็นค่า plain มาเพิ่ม
4.Auth Server => นำค่า code_verifier มาเข้ารหัสเพื่อได้ code_challenge และนำไป compare กับค่าใน db ที่ดึงมาจากการ where ด้วย authorization_code ตั้งแต่แรกอยู่แล้ว

รูป Oauth2.0 Authorization code + PKCE Flow

อ่านเพิ่มเติม https://www.authlete.com/documents/article/pkce/index

Posted in ไม่มีหมวดหมู่ | Leave a comment

change default logback to log4j2

หากคุณพยายามใช้ log4j2 แทน default logback ที่ใช้ slf4j และพบตัวแดงๆ ซึ่งหมายความว่า SLF4J พบ type class ที่ใช้เกี่ยวกับ log ทั้ง logback-classic และ log4j

SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/.../.m2/repository/org.apache.logging.log4j/log4j-slf4j-impl/2.0-beta8/jar/.../log4j-slf4j-impl-2.0-beta8.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/.../.m2/repository/ch/qos/logback/logback-classic/1.0.4/logback-classic-1.0.4.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

ให้เราทำการ Exclude dependency ที่ Conflict ออกให้หมดดังนี้

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-logging</artifactId>
   <exclusions>
    <exclusion>
     <groupId>ch.qos.logback</groupId>
     <artifactId>logback-classic</artifactId>
    </exclusion>
    <exclusion>
     <groupId>org.apache.logging.log4j</groupId>
     <artifactId>log4j-to-slf4j</artifactId>
    </exclusion>
   </exclusions>
  </dependency>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-log4j2</artifactId>
  </dependency

วิธีใช้งาน Logger

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
...
private static final Logger logger = LogManager.getLogger(MyController.class);

if you found “Exception in thread “main” java.lang.StackOverflowError”
https://stackoverflow.com/questions/32366586/using-log4j2-with-slf4j/32366618

Posted in spring boot | Leave a comment

ปัญหา window.postMessage across domains with iframe

หากคุณเคยประสบปัญหาเหล่านี้ในการทำ widgets ด้วย iframe ใช้งานจากคนละ domain
1.เป็นบางครั้งที่ window.postMessage จากหน้า iframe content ไม่ยอมทำงานส่งข้อมูลออกไปที่หน้า parent ย้ำว่าเป็นบ้างไม่เป็นบ้าง
2.จากข้อ 1.) เป็นเพียงบาง Browser เช่น Chrome บ้าง Firefox บ้าง

ให้ลองตรวจสอบดังนี้
1.คำสั่ง window.postMessage , parent.postMessage , top.postMessage จะต้องทำงานภายใน page load สำเร็จ เราจึงต้องใส่โค้ดครอบดังนี้

$(document).ready(function() {
    window.parent.postMessage("I'm loaded", "*");
});

หรือ

window.onload = function() {
   window.parent.postMessage("I'm loaded", "*");
};
Posted in ไม่มีหมวดหมู่ | Leave a comment

wampp php version not change

ถ้าเราเจอปัญหา wampp manager เลือกเปลี่ยนเวอร์ชั่นแล้วมันไม่เปลี่ยนให้เรา เราสามารถ fix ที่โค้ดได้เลย แก้ไขที่ C:/wamp64/scripts/switchPhpVersion.php

<?php
//3.0.6

require 'config.inc.php';
require 'wampserver.lib.php';

$newPhpVersion = "7.1.16";

switchPhpVersion($newPhpVersion);

?>
Posted in wampp | Leave a comment