반응형


(logback using java file time rolling)


#로그백 타임롤링은 1초단위, 1분단위, 1시간단위, 1일단위, 1달단위, 1년단위로는 로그파일을 자유롭게 생성 할 수 있지만 내가 원하는 시간에 맞추어서 할 수는 없다. 그래서 구글링을 해보니 자바를 불러와서 어느정도 내 마음대로 할 수 있도록 구현을 하는 방법이 있었음.

아래 예제는 10분단위로 로그파일 생성되도록 구현한 내용임.  내가 기억하려고 블로그에 남김 ㅋㅋ


1.logback.xml 에 어펜더 추가. 굵은 글씨의 클래스 적용

    <appender name="test-appender" class="com.test.TestAppender">
        <file>/test/test.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>

               /test/%d{yyyyMMdd,aux}/%d{yyyyMMddHHmm}.log

            </fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{5} - %msg%n
            </pattern>
        </encoder>
    </appender>




2. TestAppender.java  생성


package com.test;

import java.text.SimpleDateFormat;
import java.util.Date;

import ch.qos.logback.core.rolling.RollingFileAppender;


public class TestAppender<E> extends RollingFileAppender<E>{

 
 private static long start = System.currentTimeMillis(); // minutes
 private int rollOverTimeInMinutes = 10; // 여기에 설정한 10분마다 롤링됨
 
  @Override
 public void rollover(){
  
  try{
   
   int maxIntervalSinceLastLoggingInMillis = rollOverTimeInMinutes * 60 * 1000;
   long currentTime = System.currentTimeMillis();
   long start_rtn_str = getProc(start);
   

   if ((currentTime - start_rtn_str) >= maxIntervalSinceLastLoggingInMillis){
    super.rollover();
    start = System.currentTimeMillis();
   }
   
  }catch(Exception e){
   
  }
  

 }
 
 
 // currentTimeMillis 를 받아서 yyyyMMddHHmm 으로 변환 후에 분단위를 0으로 만든 후에 다시 currentTimeMillis 형태로 리턴(분단위 절삭).
 public static long getProc(long in_str) throws Exception {
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");
  String fmt1 = sdf.format(new Date(in_str));
  String fmt2 = fmt1.substring(0, 11)+"0";
  long rtn_str = cast_sdf_ctm(fmt2);
  return rtn_str;
 }
 
 // SimpleDateFormat 형태의 스트링을 받아서 currentTimeMillis 형태로 변환. ex) cast_sdf_ctm("20151008165215");
 public static long cast_sdf_ctm(String str) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");
        Date date = sdf.parse(str);
        long rtn_str = date.getTime();
  return rtn_str;
 }
 
 // currentTimeMillis 형태의 스트링을 받아서  SimpleDateFormat 형태로 변환. ex) cast_ctm_sdf( 1444300680353, "yyyyMMddHHmmss")
 public static String cast_ctm_sdf(long str, String fmt) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat(fmt);
        String rtn_str = sdf.format(new Date(str));
  return rtn_str;
 }
 

}


반응형

'JAVA/SPRING > JAVA' 카테고리의 다른 글

Maven으로 javadoc API 문서 만들기  (0) 2017.12.04
Eclipse 한글화  (0) 2017.12.01
[SFTP] jsch Pipe closed 익셉션 관련  (0) 2017.12.01
SFTP 사용방법 (jsch 라이브러리 사용)  (1) 2017.11.29
OOP 개념  (0) 2017.11.28
반응형

SFTPHandler.java



  /**

     * 서버와 연결에 필요한 값들을 가져와 초기화 시킴

     *

     * @param host

     *            서버 주소

     * @param userName

     *            접속에 사용될 아이디

     * @param password

     *            비밀번호

     * @param port

     *            포트번호

     */

    public void init(String host, String userName, String password, int port) {

        JSch jsch = new JSch();

        try {

            session = jsch.getSession(userName, host, port);

            session.setPassword(password);


            java.util.Properties config = new java.util.Properties();

            config.put("StrictHostKeyChecking", "no");

            session.setConfig(config);

            session.connect();


            channel = session.openChannel("sftp");

            channel.connect();


            channelSftp = (ChannelSftp) channel;            

        } catch (JSchException e) {

            e.printStackTrace();

        }

    }



 /** create by Junho

     * 헤당 경로가 없으면 mkdir 하는 함수 리턴값 : fullpath

     * @param path

     * @return

     * @throws SftpException

     */

    

    public String mkdirDir(String path) throws SftpException {

    String[] pathArray = path.split("/");

    String currentDirectory = channelSftp.pwd();


    String totPathArray = "";

    for(int i =0; i< pathArray.length; i++) {

    totPathArray += pathArray[i] + "/";

String currentPath = currentDirectory+ "/" + totPathArray;

    try {

channelSftp.mkdir(currentPath);

channelSftp.cd(currentPath);

} catch (Exception e) {

channelSftp.cd(currentPath);

}

    }

   

    return currentDirectory+ "/" + totPathArray;

}




/**

     * 단일 파일을 업로드

     *

     * @param file

     *            저장시킬 파일

     * @param dir

     *            저장시킬 주소(서버)

     */

    public boolean uploadFile(MultipartFile file, String fileName, String dir) {

    boolean result = true;

        InputStream in = null;

        try {

            //fileName = URLEncoder.encode(fileName,"EUC-KR");

       

            in = file.getInputStream();

            channelSftp.cd(dir);

            channelSftp.put(in, fileName);

            

        } catch (Exception e) {

            e.printStackTrace();

            result = false;

        } finally {

            try {

                in.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

        

        return result;

    }



 /**

     * 단일 파일 다운로드

     *

     * @param dir

     *            저장할 경로(서버)

     * @param downloadFileName

     *            다운로드할 파일

     * @param path

     *            저장될 공간

     */

    public boolean download(String dir, String downloadFileName, String path) {

    boolean result = true;

   

        InputStream in = null;

        FileOutputStream out = null;

        try {

            channelSftp.cd(dir);

            

            in = channelSftp.get(downloadFileName);

        } catch (SftpException e) {

            e.printStackTrace();

            result = false;

        }


        try {

            out = new FileOutputStream(new File(path));

            int data; 

byte b[] = new byte[2048];

while((data = in.read(b, 0, 2048)) != -1) { 

out.write(b, 0, data); 

out.flush();

}

        } catch (IOException e) {

            e.printStackTrace();

            result = false;

        } finally {

            try {

                out.close();

                in.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

        

        return result;

    }


  /**

     * 서버와의 연결을 끊는다.

     */

    public void disconnection() {

        channelSftp.quit();


    }

반응형

'JAVA/SPRING > JAVA' 카테고리의 다른 글

Maven으로 javadoc API 문서 만들기  (0) 2017.12.04
Eclipse 한글화  (0) 2017.12.01
[SFTP] jsch Pipe closed 익셉션 관련  (0) 2017.12.01
[logback] 로그백 로그파일 롤링 커스터마이징  (0) 2017.11.29
OOP 개념  (0) 2017.11.28
반응형
객체지향개발(Object Oriented Programming)의 특성은 크게 추상화, 캡슐화, 상속성, 다형성이 있다.

1) 추상화(Abstraciton)
공통의 속성이나 기능을 묶어 이름을 붙이는 것
- 객체 지향적 관점에서 클래스를 정의하는 것을 바로 추상화라고 정의 내릴 수 있겠다.
- 좀 더 살펴보면 물고기, 사자, 토끼, 뱀이 있을 때 우리는 이것들을 각각의 객체라 하며 이 객체들을 하나로 묶으려 할 때,
  만약 동물 또는 생물이라는 어떤 추상적인 객체로 크게 정의한다고 하자. 이때 동물 또는 생물이라고 묶는 것을 추상화라고 한다.

2) 캡슐화(Encapsulation)
데이터 구조와 데이터를 다루는 방법들을 결합 시켜 묶는 것. 다시 한번 말하자면 변수와 함수를 하나로 묶는것을 말한다.
- ex)
public String test() {
          string aa = "aaa";
      }
- 하지만 무작정 한대 묶으면 되는 것이 아니라
  객체가 맡은 역할을 수행하기 위한 하나의 목적을 한데 묶는다고 생각해야한다. 이것이 많이 들어본 의미로는 은닉화라고 한다.
- 또한 데이터를 절대로 외부에서 직접 접근을 하면 안되고 오로지 함수를 통해서만 접근해야하는데 이를 가능하게 해주는 것이 바로 캡슐화이다.
- 따라서 캡슐화에 성공하면 당연히 은닉화도 자연스럽게 효력이 나타난다.

3) 상속성, 재사용(Inheritance)
상위 개념의 특징을 하위 개념이 물려받는 것
- 객체지향의 하이라이트 부분이라고 생각한다. 상속이란 개념이 없으면 객체지향이나 절차지향이나 도진개진
- 간단히 예를 들자면, 자동차라는 부모클래스가 있다.
  기름을 먹거나 달리는 기능을 하는 자동차인데,
  만약 지붕뚜껑이 열리는 특수한 기능을 추가하고 싶다면 기존의 자동차에서 스포차카를 생성한다.
  그러면 스포츠카는 기름도 먹고 달리면서 지붕두껑이 열리는 기능도 갖춘 자동차가 되는 것

4) 다형성(Polymorphism)
부모클레스에서 물려받은 가상 함수를 자식 클래스 내에서 오버라이딩 되어 사용되는 것
- 간단히 예를 들자면
  군대에서 나는 K2 소총을 잡았고 동기는 K1 소총을 잡았다. 사격 훈련이 있을 때 중대장이 '준비된 사수부터 발사!'라고 외치면
  나와 내친구는 명령을 받고 앞의 사로를 향해 총을 쏜다. 이때 중대장은 추상적 객체를 상속받은 모든 객체들에게 명령을 내린것이고
  그 병사가 총이 뭐든간에 그냥 발사를 하라는 명령을 한것이다.
  즉, 다형성이 없다면 K1 소총을 든 병사 발사, K2 소총을 든 병사 발사 라며 명령을 하나하나 내려야 할 것이다



출처: http://88240.tistory.com/228 [shaking blog]

반응형

+ Recent posts