package lcy;
import java.util.*;

public class CalendarEx2 {
 
 public static void main(String[] arg) {
  
  Calendar yDay = Calendar.getInstance();
  Calendar toDay = Calendar.getInstance();
  
  // month의 경우 0부터 시작 => 9월이면 8
  yDay.set(2009, 8, 6);
  
  System.out.println("yDay = " + toString(yDay));
  System.out.println("toDay = " + toString(toDay));
  

  // 두 날짜간의 차이를 얻으려면, getTimeInMillis()를 이용해서 천분의 일초 단위로 변환해야한다.
  // 1일 = 24 * 60 * 60

  long diffSec = (toDay.getTimeInMillis() - yDay.getTimeInMillis()) / 1000;       //초
  long diffDay = diffSec/(60 * 60 * 24);                                                     //날
  System.out.println("두 날자의 일 차이수 = " + diffDay);  
 }
 
 public static String toString(Calendar cal) {
  //요일은 1부터 시작
  final String[] arrWeek = {"", "일", "월", "화", "수", "목", "금", "토"};
  int year = cal.get(Calendar.YEAR);
  int mon = cal.get(Calendar.MONTH)+1;
  int date = cal.get(Calendar.DATE);
  String weekDay = arrWeek[cal.get(Calendar.DAY_OF_WEEK)];
  
  return ( year + " 년 " + mon + "월" + date + "일 (" + weekDay + "요일)");
 }
}


출처 - 자바의 정석(도우출판, 남궁성)








두 날짜의 차이를 얻고 싶으시면, 그렇게 문자열에서 부분만을 뽑아서 계산하는 것보다는 Date 클래스를 이용하는 것이 더 깔끔하고 바람직한 방법입니다.

 

다음 코드를 참고하세요. 코드를 보시면 충분히 이해하실 것이라 생각됩니다. 수행하면 결과값이 5가 나옵니다.

 

SimpleDateFormat는 지정한 형태로 들어온 문자열을 Date 객체로 바꿔주는 역할을 합니다. 그리고, 이렇게 바뀌어진 두 날짜의 차이를 millisecond 단위로 구하고 이것을 다시 일단위로 바꾸는 것이지요.

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

 

public class DiffOfDate
{
  public static void main(String[] args) throws Exception
  {
    System.out.println(diffOfDate("20031028", "20031102"));
  }

 

  public static long diffOfDate(String begin, String end) throws Exception
  {
    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");

 

    Date beginDate = formatter.parse(begin);
    Date endDate = formatter.parse(end);

 

    long diff = endDate.getTime() - beginDate.getTime();
    long diffDays = diff / (24 * 60 * 60 * 1000);

 

    return diffDays;
  }
}


출처 - http://blog.daum.net/_blog/BlogTypeView.do?blogid=0EyjM&articleno=11806544&categoryId=294003&regdt=20090114082857#ajax_history_home








상담관리에서 시간 간격을 구하기!!

public class Test{
  pulbic static void main(String[] args){
 //시간 설정
 String start="2009-12-08 오후 04:05:56";
 Calendar tempcal=Calendar.getInstance();
 SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd a hh:mm:ss");
 Date startday=sf.parse(start, new ParsePosition(0));

 long startTime=startday.getTime();

 //현재의 시간 설정 
 Calendar cal=Calendar.getInstance();
 Date endDate=cal.getTime();
 long endTime=endDate.getTime();
  
 long mills=endTime-startTime;
  
 //분으로 변환
 long min=mills/60000;
 
 StringBuffer diffTime=new StringBuffer();
 diffTime.append("시간의 차이는").append( min).append("분 입니다.");
 System.out.println(diffTime.toString());
  }
}


SimpleDateFormat 은 Date를 사용자가 지정한 형식에 맞게 출력할 수 있도록 하는 클래스이다.
잘 알아두면 날짜 출력시 편하다.
SimpleDateFormat 클래스의 parse()메소드는 지정한 텍스트를 Date형식으로 바꿔주는 메소드이다.
Date클래스의 getTime메소드는 설정된 시각을 밀리초로 변환해준다.(long타입)

원리는 텍스트형태로 시작시간을 받아 다시 밀리초형태로 변환한다.
후에 현재 시각을 다시 밀리초형태로 변환하여 
변환한 시각끼리 차하여 남은 시간을 다시 분으로 변환해주는 것이다.

[출처] 자바 시간차 계산|작성자 보챙



출처 - http://blog.naver.com/PostView.nhn?blogId=lee159g&logNo=120130308569








// 밀리초 단위(*1000은 1초), 음수이면 이전 시각
long time = System.currentTimeMillis ( );
System.out.println ( time.toString ( ) );


현재 시각을 가져오기.


Date today = new Date ();
System.out.println ( today );

결과 : Sat Jul 12 16:03:00 GMT+01:00 2000


경과시간(초) 구하기


long time1 = System.currentTimeMillis ();
long time2 = System.currentTimeMillis ();
system
.out.println ( ( time2 - time1 ) / 1000.0 );


Date를 Calendar로 맵핑하기


Date d = new Date ( );
Calendar c = Calendar.getInstance ( );
c
.setTime ( d );


날짜(년/월/일/시/분/초) 구하기


import java.util.*;
import java.text.*;


SimpleDateFormat formatter = new SimpleDateFormat ( "yyyy.MM.dd HH:mm:ss", Locale.KOREA );
Date currentTime = new Date ( );
String dTime = formatter.format ( currentTime );
System.out.println ( dTime );



날짜(년/월/일/시/분/초) 구하기2


GregorianCalendar today = new GregorianCalendar ( );


int year = today.get ( today.YEAR );
int month = today.get ( today.MONTH ) + 1;
int yoil = today.get ( today.DAY_OF_MONTH );


GregorianCalendar gc = new GregorianCalendar ( );


System.out.println ( gc.get ( Calendar.YEAR ) );
System.out.println ( String.valueOf ( gc.get ( Calendar.MONTH ) + 1 ) );
System.out.println ( gc.get ( Calendar.DATE ) );
System.out.println ( gc.get ( DAY_OF_MONTH ) );



날짜(년/월/일/시/분/초) 구하기3


DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.KOREA);
Calendar cal = Calendar.getInstance(Locale.KOREA);
nal
= df.format(cal.getTime());


- 표준시간대를 지정하고 날짜를 가져오기.


TimeZone jst = TimeZone.getTimeZone ("JST");
Calendar cal = Calendar.getInstance ( jst ); // 주어진 시간대에 맞게 현재 시각으로 초기화된 GregorianCalender 객체를 반환.// 또는 Calendar now = Calendar.getInstance(Locale.KOREA);
System.out.println ( cal.get ( Calendar.YEAR ) + "년 " + ( cal.get ( Calendar.MONTH ) + 1 ) + "월 " + cal.get ( Calendar.DATE ) + "일 " + cal.get ( Calendar.HOUR_OF_DAY ) + "시 " +cal.get ( Calendar.MINUTE ) + "분 " + cal.get ( Calendar.SECOND ) + "초 " );

결과 : 2000년 8월 5일 16시 16분 47초 


영어로된 날짜를 숫자로 바꾸기


Date myDate = new Date ( "Sun,5 Dec 1999 00:07:21" );
System.out.println ( myDate.getYear ( ) + "-" + myDate.getMonth ( ) + "-" + myDate.getDay ( ) );


"Sun, 5 Dec 1999 00:07:21"를 "1999-12-05"로 바꾸기


SimpleDateFormat formatter_one = new SimpleDateFormat ( "EEE, dd MMM yyyy hh:mm:ss",Locale.ENGLISH );
SimpleDateFormat formatter_two = new SimpleDateFormat ( "yyyy-MM-dd" );


String inString = "Sun, 5 Dec 1999 00:07:21";


ParsePosition pos = new ParsePosition ( 0 );
Date frmTime = formatter_one.parse ( inString, pos );
String outString = formatter_two.format ( frmTime );


System.out.println ( outString );



숫자 12자리를, 다시 날짜로 변환하기


Date conFromDate = new Date();
long ttl = conFromDate.parse ( "Dec 25, 1997 10:10:10" );
System.out.println ( ttl ); //예 938291839221


Date today = new Date ( ttl );
DateFormat format = DateFormat.getDateInstance ( DateFormat.FULL,Locale.US );
String formatted = format.format ( today );
System.out.println ( formatted );



특정일로부터 n일 만큼 이동한 날짜 구하기

특정일의 시간을 long형으로 읽어온다음..
날짜*24*60*60*1000 을 계산하여.
long형에 더해줍니다.
그리고 나서 Date클래스와 Calender클래스를 이용해서 날짜와 시간을 구하면 됩니다


특정일에서 일정 기간후의 날짜 구하기2


//iDay 에 입력하신 만큼 빼거나 더한 날짜를 반환 합니다.
import java.util.*;


public String getDate ( int iDay )
{
Calendar temp=Calendar.getInstance ( );
StringBuffer sbDate=new StringBuffer ( );


temp.add ( Calendar.DAY_OF_MONTH, iDay );


int nYear = temp.get ( Calendar.YEAR );
int nMonth = temp.get ( Calendar.MONTH ) + 1;
int nDay = temp.get ( Calendar.DAY_OF_MONTH );


sbDate.append ( nYear );
if ( nMonth < 10 )
sbDate
.append ( "0" );
sbDate
.append ( nMonth );
if ( nDay < 10 )
sbDate
.append ( "0" );
sbDate
.append ( nDay );


return sbDate.toString ( );
}



현재날짜에서 2달전의 날짜를 구하기


Calendar cal = Calendar.getInstance ( );//오늘 날짜를 기준으루..
cal
.add ( cal.MONTH, -2 ); //2개월 전....
System.out.println ( cal.get ( cal.YEAR ) );
System.out.println ( cal.get ( cal.MONTH ) + 1 );
System.out.println ( cal.get ( cal.DATE ) );


달에 마지막 날짜 구하기


for ( int month = 1; month <= 12; month++ )
{
GregorianCalendar cld = new GregorianCalendar ( 2001, month - 1, 1 );
System.out.println ( month + "/" + cld.getActualMaximum ( Calendar.DAY_OF_MONTH ) );
}


해당하는 달의 마지막 일 구하기


GregorianCalendar today = new GregorianCalendar ( );
int maxday = today.getActualMaximum ( ( today.DAY_OF_MONTH ) );
System.out.println ( maxday );


특정일을 입력받아 해당 월의 마지막 날짜를 구하는 간단한 예제.(달은 -1 해준다.)...윤달 30일 31일 알아오기.


Calendar cal = Calendar.getInstance ( );
cal
.set ( Integer.parseInt ( args[0] ), Integer.parseInt ( args [1] ) - 1, Integer.parseInt ( args [2] ) );
SimpleDateFormat dFormat = new SimpleDateFormat ( "yyyy-MM-dd" );
System.out.println ( "입력 날짜 " + dFormat.format ( cal.getTime ( ) ) );
System.out.println ( "해당 월의 마지막 일자 : " + cal.getActualMaximum ( Calendar.DATE ) );


해당월의 실제 날짜수 구하기 ( 1999년 1월달의 실제 날짜수를 구하기 )


Calendar calendar = Calendar.getInstance ( );
calendar
.set ( 1999, 0, 1 );
int maxDays = calendar.getActualMaximum ( Calendar.DAY_OF_MONTH );


어제 날짜 구하기

오늘날짜를 초단위로 구해서 하루분을 빼주고 다시
셋팅해주면 쉽게 구할수 있죠..
setTime((기준일부터 오늘까지의 초를 구함) - 24*60*60)해주면 되겠죠..

어제 날짜 구하기2


import java.util.*;


public static Date getYesterday ( Date today )
{
if ( today == null )
throw new IllegalStateException ( "today is null" );
Date yesterday = new Date ( );
yesterday
.setTime ( today.getTime ( ) - ( (long) 1000 * 60 * 60 * 24 ) );


return yesterday;
}



내일 날짜 구하기


Date today = new Date ( );
Date tomorrow = new Date ( today.getTime ( ) + (long) ( 1000 * 60 * 60 * 24 ) );


내일 날짜 구하기2


Calendar today = Calendar.getInstance ( );
today
.add ( Calendar.DATE, 1 );
Date tomorrow = today.getTime ( );


오늘날짜에서 5일 이후 날짜를 구하기


Calendar cCal = Calendar.getInstance();
c
.add(Calendar.DATE, 5);


날짜에 해당하는 요일 구하기


//DAY_OF_WEEK리턴값이 일요일(1), 월요일(2), 화요일(3) ~~ 토요일(7)을 반환합니다.
//아래 소스는 JSP일부입니다.
import java.util.*;


Calendar cal= Calendar.getInstance ( );
int day_of_week = cal.get ( Calendar.DAY_OF_WEEK );
if ( day_of_week == 1 )
m_week
="일요일";
else if ( day_of_week == 2 )
m_week
="월요일";
else if ( day_of_week == 3 )
m_week
="화요일";
else if ( day_of_week == 4 )
m_week
="수요일";
else if ( day_of_week == 5 )
m_week
="목요일";
else if ( day_of_week == 6 )
m_week
="금요일";
else if ( day_of_week == 7 )
m_week
="토요일";



콤보박스로 선택된 날짜(예:20001023)를 통해 요일을 영문으로 가져오기


//gc.get(gc.DAY_OF_WEEK); 하면 일요일=1, 월요일=2, ..., 토요일=7이 나오니까,
//요일을 배열로 만들어서 뽑아내면 되겠죠.
GregorianCalendar gc=new GregorianCalendar ( 2000, 10 - 1 , 23 );
String [] dayOfWeek = { "", "Sun", "Mon", .... , "Sat" };
String yo_il = dayOfWeek ( gc.get ( gc.DAY_OF_WEEK ) );


두 날짜의 차이를 일수로 구하기

각각의 날짜를 Date형으로 만들어서 getTime()하면 
long으로 값이 나오거든요(1970년 1월 1일 이후-맞던가?- 1/1000 초 단위로..)
그러면 이값의 차를 구해서요. (1000*60*60*24)로 나누어 보면 되겠죠.


두 날짜의 차이를 일수로 구하기2


import java.io.*;
import java.util.*;


Date today = new Date ( );
Calendar cal = Calendar.getInstance ( );
cal
.setTime ( today );// 오늘로 설정.


Calendar cal2 = Calendar.getInstance ( );
cal2
.set ( 2000, 3, 12 ); // 기준일로 설정. month의 경우 해당월수-1을 해줍니다.


int count = 0;
while ( !cal2.after ( cal ) )
{
count
++;
cal2
.add ( Calendar.DATE, 1 ); // 다음날로 바뀜


System.out.println ( cal2.get ( Calendar.YEAR ) + "년 " + ( cal2.get ( Calendar.MONTH ) + 1 ) + "월 " + cal2.get ( Calendar.DATE ) + "일" );
}


System.out.println ( "기준일로부터 " + count + "일이 지났습니다." );



두 날짜의 차이를 일수로 구하기3


import java.io.*;
import java.util.*;


public class DateDiff
{
public static int GetDifferenceOfDate ( int nYear1, int nMonth1, int nDate1, int nYear2, int nMonth2, int nDate2 )
{
Calendar cal = Calendar.getInstance ( );
int nTotalDate1 = 0, nTotalDate2 = 0, nDiffOfYear = 0, nDiffOfDay = 0;


if ( nYear1 > nYear2 )
{
for ( int i = nYear2; i < nYear1; i++ )
{
cal
.set ( i, 12, 0 );
nDiffOfYear
+= cal.get ( Calendar.DAY_OF_YEAR );
}
nTotalDate1
+= nDiffOfYear;
}
else if ( nYear1 < nYear2 )
{
for ( int i = nYear1; i < nYear2; i++ )
{
cal
.set ( i, 12, 0 );
nDiffOfYear
+= cal.get ( Calendar.DAY_OF_YEAR );
}
nTotalDate2
+= nDiffOfYear;
}


cal.set ( nYear1, nMonth1-1, nDate1 );
nDiffOfDay
= cal.get ( Calendar.DAY_OF_YEAR );
nTotalDate1
+= nDiffOfDay;


cal.set ( nYear2, nMonth2-1, nDate2 );
nDiffOfDay
= cal.get ( Calendar.DAY_OF_YEAR );
nTotalDate2
+= nDiffOfDay;


return nTotalDate1-nTotalDate2;
}


public static void main ( String args[] )
{
System.out.println ( "" + GetDifferenceOfDate (2000, 6, 15, 1999, 8, 23 ) );
}
}



파일에서 날짜정보를 가져오기


File f = new File ( directory, file );


Date date = new Date ( f.lastModified ( ) );
Calendar cal = Calendar.getInstance ( );
cal
.setTime ( date );


System.out.println("Year : " + cal.get(Calendar.YEAR));
System.out.println("Month : " + (cal.get(Calendar.MONTH) + 1));
System.out.println("Day : " + cal.get(Calendar.DAY_OF_MONTH));
System.out.println("Hours : " + cal.get(Calendar.HOUR_OF_DAY));
System.out.println("Minutes : " + cal.get(Calendar.MINUTE));
System.out.println("Second : " + cal.get(Calendar.SECOND));



날짜형식으로 2000-01-03으로 처음에 인식을 시킨후
7일씩 증가해서 1년정도의 날짜를 출력해 주고 싶은데요.


SimpleDateFormat sdf = new SimpleDateFormat ( "yyyy-mm-dd" );
Calendar c = Calendar.getInstance ( );


for ( int i = 0; i < 48; i++ )
{
c
.clear ( );
c
.set ( 2000, 1, 3 - ( i * 7 ) );
java
.util.Date d = c.getTime ( );
String thedate = sdf.format ( d );
System.out.println ( thedate );
}



쓰레드에서 날짜 바꾸면 죽는 문제

Main화면에 날짜와시간이Display되는 JPanel이 있습니다.
date로 날짜와 시간을 변경하면 Main화면의 날짜와 시간이 Display되는 Panel에 
변경된 날짜가 Display되지 않고 Main화면이 종료되어 버립니다.

문제소스:


public void run ( )
{
while ( true )
{
try{
timer
.sleep ( 60000 );
}
catch ( InterruptedException ex ) { }


lblTimeDate.setText ( fGetDateTime ( ) );
repaint
( );
}
}


public String fGetDateTime ( )
{
final int millisPerHour = 60 * 60 * 1000;
String DATE_FORMAT = "yyyy / MM / dd HH:mm";
SimpleDateFormat sdf = new SimpleDateFormat ( DATE_FORMAT );
SimpleTimeZone timeZone = new SimpleTimeZone ( 9 * millisPerHour, "KST" );
sdf
.setTimeZone ( timeZone );


long time = System.currentTimeMillis ( );
Date date = new Date ( time );
return sdf.format ( date );
}

해답:


// 날짜와 요일 구한다. timezone 으로 날짜를 다시 셋팅하시면 됨니다.
public String getDate ( )
{
Date now = new Date ( );
SimpleDateFormat sdf4 = new SimpleDateFormat ( "yyyy/MM/dd HH:mm EE" );
sdf4
.setTimeZone ( TimeZone.getTimeZone ( "Asia/Seoul" ) );


return sdf4.format ( now );
}



날짜와 시간이 유효한지 검사하려면...?


import java.util.*;
import java.text.*;


public class DateCheck
{
boolean dateValidity = true;


DateCheck ( String dt )
{
try
{
DateFormat df = DateFormat.getDateInstance ( DateFormat.SHORT );
df
.setLenient ( false );
Date dt2 = df.parse ( dt );
}
catch ( ParseException e ) { this.dateValidity = false; }
catch ( IllegalArgumentException e ) { this.dateValidity = false; }
}


public boolean datevalid ( )
{
return dateValidity;
}


public static void main ( String args [] )
{
DateCheck dc = new DateCheck ( "2001-02-28" );
System.out.println ( " 유효한 날짜 : " + dc.datevalid ( ) );
}
}



두 날짜 비교하기(아래보다 정확)

그냥 날짜 두개를 long(밀리 세컨드)형으로 비교하시면 됩니다...

이전의 데이타가 date형으로 되어 있다면, 이걸 long형으로 변환하고.
현재 날짜(시간)은 System.currentTimeMillis()메소드로 읽어들이고,
두수(long형)를 연산하여 그 결과 값으로 비교를 하시면 됩니다.

만약 그 결과값이 몇시간 혹은 며칠차이가 있는지를 계산할려면,
결과값을 Calender의 setTimeInMillis(long millis) 메소드를 이용해
설정한다음 각각의 날짜나 시간을 읽어오시면 됩니다


두 날짜 비교하기2


//Calendar를 쓸 경우 데이타의 원본을 고치기 때문에 clone()을 사용하여
//복사한 후에 그 복사본을 가지고 비교한다
import java.util.*;
import java.util.Calendar.*;
import java.text.SimpleDateFormat;


public class DayComparisonTest
{
public static void main(String args[])
{
Calendar cal = Calendar.getInstance();
SimpleDateFormat dateForm = new SimpleDateFormat("yyyy-MM-dd");


Calendar aDate = Calendar.getInstance(); // 비교하고자 하는 임의의 날짜
aDate
.set(2001, 0, 1);


Calendar bDate = Calendar.getInstance(); // 이것이 시스템의 날짜


// 여기에 시,분,초를 0으로 세팅해야 before, after를 제대로 비교함
aDate
.set( Calendar.HOUR_OF_DAY, 0 );
aDate
.set( Calendar.MINUTE, 0 );
aDate
.set( Calendar.SECOND, 0 );
aDate
.set( Calendar.MILLISECOND, 0 );


bDate.set( Calendar.HOUR_OF_DAY, 0 );
bDate
.set( Calendar.MINUTE, 0 );
bDate
.set( Calendar.SECOND, 0 );
bDate
.set( Calendar.MILLISECOND, 0 );



if (aDate.after(bDate)) // aDate가 bDate보다 클 경우 출력
System.out.println("시스템 날짜보다 뒤일 경우 aDate = " + dateForm.format(aDate.getTime()));
else if (aDate.before(bDate)) // aDate가 bDate보다 작을 경우 출력
System.out.println("시스템 날짜보다 앞일 경우 aDate = " + dateForm.format(aDate.getTime()));
else // aDate = bDate인 경우
System.out.println("같은 날이구만");
}
}


출처 - http://blog.naver.com/PostView.nhn?blogId=kimgas2000&logNo=90149472834






Posted by linuxism
,

mysql - sql 연산자

DB/MySQL 2012. 9. 8. 10:39


연결연산자

 

일반적인 DBMS에서는 '||'로 문자열을 연결하지만 MySQL에서는 '||'을 사용할수 없고

CONCAT() 이라는 함수를 이용해 문자열을 연결한다.

사용예제1

update zet_adsense_log set cdatetime = cdate || ctime;

-- 위의 쿼리후에 cdatetime 컬럼값에는 1만 들어간다.(잘못된 쿼리)

update zet_adsense_log set cdatetime = concat(cdate, ctime);

-- 위의 쿼리후에 cdatetime 컬럼값에는 cdate 컬럼값과 ctime 컬럼값이 합쳐져 정상적으로

들어간다.(정상 쿼리)

사용예제2

select concat('a',concat('a','a'));

 

관계연산자

 

AND 양쪽 조건이 둘다 참이면 참   (&&사용가능)

OR   양쪽 조건중 하나라도 참이면 참 둘다 거짓이면 거짓  (||사용가능)

NOT 이후의 조건이 거짓이면 참   (!사용가능)

 

between과 not between사용

 

select * from date1 where a between '2005-01-01' and '2005-01-04';

(date1table에서 2005-01-01에서 2005-01-04사이의 datetime형의 데이타 검색)

select * from date1 where a between '2005-01-01' and '2005-01-04';

(date1table에서 2005-01-01에서 2005-01-04사이에 포함되지 않은  datetime형의 데이타 검색)

 

in과 not in사용

 

select * from Book where title not in('a','b');
(boot테이블에서 title이 a와 b가 아닌것만 검색)

 

select * from Book where title not in('a','b');
(boot테이블에서 title이 a와 b인것만 검색)

 

LIKE, NOT LIKE 연산자

 

select * from Book where title not like '%a%';
(boot테이블에서 title에 a가 들어가 있지 않은것만 검색)

 

select * from Book where title like '%a%';
(boot테이블에서 title에 a가 들어가 있는것만 검색)

 

select * from Book where title like '%___%';

(boot 테이블에서 title 컬럼값의 글자수가 3개인것만 검색)

 

select * from Book where title like '%_L_%';

(boot 테이블에서 title 컬럼값의 글자수가 3개이면서 가운데 자리에 L이 들어간것만 검색)

 

※ like 연산자 사용시 %, _를 문자로 인식하여 검색하기

% 를 \% 로 변경

_ 를 \_ 로 변경

 

*like와 not like는 반대의 개념*

REGEXP와 not REGEXP사용

select * from book where a regexp b;

(a가 정규식b에 맞을경우 검색)

select * from book where a not regexp b;

(a가 정규식b에 맞지않을경우 검색)

 

null와 is null 사용

select * from book where a is null;

(a의 값이 null이 맞을경우 검색)

select * from book where a is not null;

(a의 값이 null이 아닌경우 검색)


출처 - http://www.zetswing.com/bbs/board.php?bo_table=MySQL_LEC&wr_id=10






MySQL문에서 사용되는 연산자 목록


 연산자

설명 

 =

 같다

 <

 작다

 >

 크다

 <=

 작거나 같다

 >=

 크거나 같다

 != 또는 <>

 다르다

 IS NOT NULL

 널(NULL)값이 아니다

 IS NULL

 널(NULL)값이다

 BETWEEN

 범위내 값이 존재한다

 NOT BETWEEN

 범위밖에 값이 존재한다

 IN

 목록에 값이 존재한다

 OR 또는 ||

 둘중 하나라도 참인경우

 AND 또는 &&

 둘다 무조건 참인경우 

 NOT 또는 !

 거짓일때

 


Mysql 함수

 

 함수

 설명

 NOW()

 서버상의 현재 날짜와 시간을 반환 

 SHA1('문자열')

 40byte의 암호화된 문자로 변환, 단방향 암호화, mysql 5.0.2부터 사용가능 

 MD5('무자열')

 32byte의 암호화된 문자로 변환, 단방향 암호화 

 CONCAT('문자열1','문자열2',...)

 문자열1문자열2 형태로 이어서 반환

 CONCAT_WS('구분자','문자열1','문자열2',...)

 문자열1구분자문자열2구분자... 형태로 이어서 반환

 LENGTH('문자열')

 문자열의 길이

 LEFT('문자열',갯수)

 문자열에서 왼쪽부터 갯수만큼 반환 

 RIGHT('문자열',갯수)

 문자열에서 오른부터 갯수만큼 반환 

 TRIM('문자열')

 문자열 앞뒤의 공백을 제거후 반환 

 UPPER('문자열')

 문자열을 대문자로 변환후 반환

 LOWER('문자열')

 문자열을 소문자로 변환후 반환

 SUBSTRING('문자열',x,y)

 문자열의 x번째에서 y개를 반환 

 ABS(v)

 v의 절대값

 CEILING(v)

 v 다음의 가장 큰 정수

 FLOOR(v)

 v의 정수

 FORMAT(v1,v2) 

 v1은 입력값, v2는 반환할 소수점 자리수, 천단위 콤마 표시됨

 MOD(v1,v2)

 v2 / v1 의 나머지

 POW(v1,v2)

 v1을 v2제곱

 RAND()

 0에서 1.0사이의 난수  

 ROUND(v1,v2)

 v1은 입력값, v2 십진 자리수로 반올리

 SQRT(v1) 

 v1의 제곱근 


출처 - http://blog.naver.com/PostView.nhn?blogId=yiuse78&logNo=50107260847&categoryNo=35&viewDate=&currentPage=1&listtype=0


'DB > MySQL' 카테고리의 다른 글

mysql - if문 사용  (0) 2012.09.14
mysql - enum type  (0) 2012.09.12
mysql - 이벤트(Event)  (0) 2012.09.07
mysql - 날짜 함수 및 날짜 변환  (0) 2012.09.03
mysql - 사용자 패스워드 변경하기  (0) 2012.09.03
Posted by linuxism
,

linux - logrotate

System/Linux 2012. 9. 7. 17:39


- sample

# more /etc/logrotate.d/apache2 

/var/log/apache2/*.log {

weekly

missingok

rotate 52

compress

delaycompress

notifempty

create 640 root adm

sharedscripts

postrotate

if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then

/etc/init.d/apache2 reload > /dev/null

fi

endscript

}


# more /etc/logrotate.d/tomcat

/var/log/tomcat/catalina.out {

    copytruncate

    weekly

    rotate 52

    compress

    delaycompress

    missingok

    create 0640 root root

    notifempty

}






 1. logrotate 개론

앞선강좌에서 누차 강조드린 바와 같이 리눅스뿐아니라 거의 모든 운영체제에서는 로그파일의 종류와 그 크기를 어떻게 보관하고 관리할 것인가에 대한 것이 아주중요하게 다루어지고 있다.

 logrotate는 이에 대한 해답을 주는 유틸리티라고 할 수 있다.

즉, logrotate는 시스템에 있는 모든 로그파일들을 관리할 수 있으며 이들 로그파일들을 자르고(rotate), 보관하고, 삭제하고, 압축하고, 메일로 보내주는 등의 작업을 할 수 있게 한다.

구체적인 예를 들자면, 아파치 웹서버에서 방문기록을 저장하고 있는 웹로그파일은 access_log이다. (물론 이파일의 이름과 위치는 얼마든지 바꾸어 사용할 수 있다. )

이 파일은 하루에도 엄청나게 많은 용량으로 저장이 된다. (물론 어느정도의 방문자가 있다는 조건에서)

필자가 관리하는 수퍼유저코리아의 웹서버만 하더라도 하루에 약 33MB정도의 용량으로 저장이 된다.

그렇다면 한달이면 약 990MB, 그러니까 약 1GB정도가 조금 들 필요하다고 할 수 있을 것이다.

이런 파일을 그냥 두게되면 얼마가지 않아서 할당된 파티션에 파일시스템풀(Filesystem Full)이 나서 시스템이 다운이 될 수가 있다.

특히, 웹호스팅서버와 같이 하나의 서버에 여러개의 웹사이트를 운영되는 서버에는 매우 심각하다고 할 수 있다.

 

더군다나 서버에는 웹로그만 있는 것이 아니고 앞선강좌에서 설명드렸듯이 리눅스의 기본적인 로그파일만 10여개가 넘는다.

이런 로그파일들을 적당한 크기로 자르고(rotate), 압축하여, 보관하거나, 삭제하는등의 작업이 주기적으로 필요하게된다.

 

logrotate는 이런 cron에 의해 주기적으로 이런작업을 훌륭히 수행해 낸다.

바로 여기에 logrotate의 역할과 필요성이 존재한다고 볼 수 있으며 logrotate가 개발된 이유이기도 하다.



 2. logrotate 파일구성

logrotate는 리눅스가 설치되면서 대부분 기본적으로 패키지형태로 설치가 된다.

logrotate의 데몬과 설정파일들을 살펴보면 다음과 같다.

구   분

위치 및 실행방법

설             명

데몬(위치)

/usr/sbin/logrotate

데몬의 위치 및 데몬프로그램

데몬 설정파일

/etc/logrotate.conf

설정파일

설정디렉토리

/etc/logrotate.d

logrotate에 적용할 각종로그파일들 보관하는 디렉토리

상황파일

/var/lib/logrotate.status

logrotate한 작업내역을 보관한 파일

cron(일단위)

/etc/cron.daily/logrotate

logrotate는 주기적으로 실행이되어야하므로 cron에 의해 일단위로 실행이 됨

먼저, /usr/sbin/logrotate는 logrotate의 데몬프로그램이다. crond에 의해 주기적으로 실행이 되는 프로그램이다 .

/etc/logrotate.conf파일은 logrotate가 실행이되면서 읽어들인후 각각의 로그파일들을 이 파일의 설정에 의하여 자르거나(rotate), 삭제하거나, 압축을 하게된다.

/etc/logrotate.d 파일은 각각의 로그파일들에 대한 개별적인 설정파일들이 존재하는 디렉토리이며, 추가로 적용할 로그파일에 대한 설정을 여기서 하면된다. 예를 들어 보안체크를 위해 tripwire를 설치하였다면 이프로그램의 로그파일이 존재할 것이다. 따라서 이 로그파일의 관리를 위해서 이 디렉토리에 적당한 이름의 파일을 생성하고 원하는 설정을 하여 logrotate에 의해 관리되게끔 하면 된다.

마지막으로 /etc/cron.daily/logrotate 파일은 주기적으로 실행이 될 logrotate를 cron에 넣어둔 것이다.

즉, 이 cron설정으로 인해 logrotate는 하루에 한번씩 주기적으로 실행이 될 수 있는 것이다. 



 3. logrotate의 설치 및 업그레이드 및 제거

먼저 시스템에 설치되어 있는 logrotate의 rpm 패키지버전을 확인해 보도록 하자.

확인하는 방법은 아래와 같다. 

위의 예에서 현재 시스템에 설치되어 있는 logrotate의 패키지 버전은 logrotate-3.5.2-1임을 알 수 있다.

 

이제 이렇게 획득한 정보를 이용하여 logrotate의 패키지 구성을 살펴보도록 하자.

확인하는 방법은 아래와 같다.

위의 예처럼 logrotate의 주구성 파일과 디렉토리는

  • /etc/cron.daily/logrotate
  • /etc/logrotate.conf
  • /etc/logrotate.d
  • /usr/sbin/logrotate

과 같다.

이들 파일에 대한 설명은 2절에서 이미 다루었으므로 생략한다.

 

마지막으로 logrotate를 rpm으로 재설치 및 업그레이드하는 방법에 대해서 알아보자.

 

rpm으로 재설치하거나 업그레이드하는 방법은 위의 예처럼 _Uvh옵션으로 뒤에 패키지이름을 주면 된다.

 

이상으로 logrotate의 구성파일들에 대해서 살펴보았다.



 4. logrotate.conf 샘플

logrotate의 설정디렉토리 /etc/logrotate.d/에 있는 여러개의 파일중 syslog파일의 일부이다.

물론, 이 설정을 /etc/logrotate.conf 파일내에 있어도 마찬가지 결과를 얻을 수 있다.

 

위의 설정을 설명하면 다음과 같다.

/var/log/messages  
대상로그파일, 즉, logrotate에 의해서 작업될 로그파일을 절대패스로 지정해둔 것이다. 
그리고, 그 다음의 "{" 부터 "}"까지는 이 로그파일에 대한 개별적인 설정이 된다.

monthly
대상로그파일(/var/log/messages)을 순환시킬 주기이며, monthly이므로 한달에 한번씩 이 파일이 순환(rotate)되게 된다. 
뒤에서 설명하게되겠지만 참고로 순환주기에는 daily, weekly, monthly등이 있다. 이에 대한 설명은 뒤에서 자세히 다루게 된다.

compress
순환(rotate)된 파일이 gzip에 의해서 압축이 된다. 반대의 옵션은 nocompress이며 압축을 하지 않게 된다.
(기우겠지만, 순환되어 새로 생성되어 저장되고 있는 로그파일은 압축이 되지 않는다.)

rotate 2
순환되는 파일갯수를 지정한다. 0부터 시작하게되며 위의 예에서 monthly로 지정했기 때문에 2달간 로그파일이 저장되어 있게된다.

mail  
순환되어 지정된 갯수를 지나게되는 로그파일은 지정된 메일주소로 메일로 보내지게 된다. 
메일을 보내지 않으려면 nomail이라고 하면 된다.

errors 
지정된 log파일의 logrotate작업시에 에러가 발생을 하면 지정된 메일주소로 메일을 발송하게 된다. 
 

postrotate/endscript
이것은 지정된 로그파일에 logrotate작업이 끝나고 난 이후에 실행할 작업을 설정해둔 것이다. 
대부분 이부분에 설정되는 작업은 rotate된 로그파일의 데몬을 재시작시키는 작업이다. 
반대의 작업을 하려면 즉, logrotate작업 전에 실행할 작업이 있다면
postrotate/endscript대신에 prerotate/endscript를 사용하면 된다.

 

6. logrotate 주요옵션

 (참고 : "man logrotate" 해서 보면 logrotate에 대한 옵션이 굉장히 많다. 아래에 소개해드리는 옵션은 자주사용하는 옵션이거나 필자의 견해로 보아 중요하다고 생각되는 옵션을 설명드린 것이므로 이외의 옵션에 대해서 알고자 한다면 man page를 참조바란다. )

-f, --force  

강제순환시킨다. 이 옵션은 새로운 항목을 추가한 후에 로그파일을 순환시키거나 옛날 로그파일이 이미 삭제되어 새로운 로그파일이 생성되어 로그기록이 계속되고 있을 경우에 유용한 옵션이다.

 

-s, --state <statefile>

기본 상황파일인 /var/lib/logrotate.status 파일대신에 지정한 state파일을 사용한다.

 

--usage

logrotate의 기본 사용법을 간단히 보여준다.

 

compress

순환되는 로그파일을 gzip으로 압축하게된다. nocompress와는 반대.

 

nocompress

순환되는 로그파일의 압축을 하지 않는다. 반대는 compress

 

create mode owner group

순환되어  생성되는 로그파일의 파일퍼미션(mode)과 소유자(owner), 그리고 그룹소유자(group)를 지정한 것이다. 
(예, create root 600 wheel)

 

daily

로그파일을 매일주기로 순환시킨다.

 

weekly

로그파일을 매주주기로 순환시킨다.

 

monthly

로그파일을 한달주기로순환시킨다.

 

errors address

logrotate작업시에 에러가 발생한다면 지정된 메일주소로 메일을 보내게 된다.

 

extension ext

logrotate 실행후에 순환되어 생성되는 파일의 이름뒤에 확장자로 붙일 확장자명을 지정한다.
만약 compress라는 옵션으로 gzip으로 압축을 했다면 gz라가 확장자 뒤에 붙게된다. 
예를 들면 compress라는 옵션과 함께 "extension ext"옵션이 주어졌다면 logrotate실행후에 생성되는 파일은 messages.0.ext.gz과 같은 모양새를 갖게되는 것이다

 

ifempty

로그파일이 비어있는 경우에도  rotate(순환)을 하게된다. 기본값이다.

 

notifempty

ifempty와는 반대로 로그파일이 비어있을 경우에는 순환을 하지 않는다.

 

mail address

logrotate작업후에 이전로그파일을 지정된 메일주소로 메일을 보낸다. (특정한 경우의 로그파일은 보내지 않을 수도 있다. )

 

postrotate/endscript

logrotate작업 이후에 지정된 작업(스크립트)을 실행한다.

 

prerotate/endscript

logrotate작업 이전에 지정된 작업(스크립트)을 실행한다.

 

 rotate count

logrotate의 실행결과 순환되는 파일들의 총 갯수라고 이해하자.
즉, logrotate의 결과 삭제되거나 지정된 주소로 메일로 보내지기전의 총 파일갯수라고 이해하면 된다.
그리고 rotate 0로 설정하고 나면 이전파일은 순환과 함께 삭제되어 버린다.

 

size size

logrotate의 결과 순환된 결과 파일사이즈가 지정한 크기를 넘지 않도록 한다.
지정하는 방법은 100k, 100M등으로 용량단위를 붙여서  지정하면 된다.


출처 - http://www.superuser.co.kr/linux/logrotate/page01.htm


추가 옵션

dateext : 순환된 로그파일의 날짜확장자

mail : 순환되어 저장된 갯수를 넘게되는 파일은 메일주소로 메일을 보내게 된다. 반대는 nomail

size 100M : 순환된 결과 파일사이즈가 지정한 크기를 넘지 않도록 한다. 숫자만 적으면 byte로 킬로바이트는 k, 메가바이트는 M이다 ex) 100k, 100M 

       ›   delaycompress : 로그 파일의 압축을 다음 로테이션까지 미룬다








/etc/logrotate.d 밑에 보면 로그를 위한 설정파일이 위치해 있습니다.

특정 서비스를 추가, 변경, 삭제하는 것으로 적용할 수 있습니다.

 

다음은 Ubuntu에서 /etc/logrotate.d/apache2 내용입니다.

 /var/log/apache2/*.log {

        # 로그파일 순환 주기

        # valid value : daily, weekly, monthly
        weekly

        # 파일이 존재하지 않을 경우

        # vaild value : nomissingok - 불가, missingok - 처리
        missingok

        # 로그파일 개수

        # 설정갯수 이후로는 순차적으로 삭제
        rotate 52

        # 압축여부

        # valid value : compress, nocompress
        compress

        # compress와 같이 쓰이며 지난 파일에 대해 압축하지 않는다.

        # 없으면 지난 파일도 압축
        delaycompress

        # 로그 파일이 비어있을 경우

        # valid value : ifempty - 처리, notifempty - 불가

        notifempty

        # 순환되는 파일의 권한과 소유,그룹 설정
        create 640 root adm

        # 개별적으로 각 로그파일에 대한 스크립트(prerotate or postrotate)를 실행합니다.

     # valid value : sharedscripts, nosharedscripts
        sharedscripts

        # rotate 작업 이후에 실행될 스크립트

        # 시작(postrotate)과 종료(endscript)를 명시해야 합니다.
        postrotate
                /etc/init.d/apache2 reload > /dev/null
        endscript
}

[출처] logrotate|작성자 얼룩푸우


출처 - http://blog.naver.com/PostView.nhn?blogId=budget74&logNo=90108092379








 리눅스를 서버로 돌리면 하루에도 많은 로그 파일이 생성된다. 사용자가 웹에 접속할때, 메일을 받거나 읽을 때 등 가만히 놓아두면 엄청나게 느는 로그 파일을 볼 수 있을 것이다.

이 런 로그 파일들을 컴퓨터가 적절히 압축하고 잘라내고 관리하도록 설정하는 프로그램이 logrotate이다. 요즘에는 기본적으로 시스템 설치시 logrotate를 설치하는 경우가 대부분이며 Mandrake 8.1에서는 /etc/cron.daily에 다음과 같은 내용으로 실행시키고 있다.

#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf


즉 /etc/logrotate.conf 파일을 설정 파일로 주어서 매일 logrotate를 실행시키는 것이다. 그럼 logrotate.conf 파일을 보자. 다음은 Mandrake 8.1의 기본 내용이다.

# 매주 로그 파일을 처리한다.
weekly
# 4주간의 로그 파일을 보관한다.
rotate 4
# 오류는 root 사용자에게 보고한다.
errors root
# 이전 로그 파일을 저장한 다음 새로운 로그 파일을 만든다.
create
# 이전 로그 파일은 압축하여 저장한다.
compress
# /etc/logrotate.d 디렉토리내의 파일들을 읽어들여서 처리한다.
include /etc/logrotate.d


배포판에 따라서 내용이 조금씩 다르겠지만 logrotate가 설치되어 있다면 기본 골격은 비슷할 것이다.

여기에 대한 설명은 코멘트로 생략하고 앞서 logrotate 매뉴얼에 나와 있는 예를 먼저 들어 보겠다.

# sample logrotate configuration file
errors 
sysadmin@my.org
compress

/var/log/messages {
   rotate 5
   weekly
   postrotate
             /sbin/killall -HUP syslogd
   endscript
}

"var/log/httpd/access.log" /var/log/httpd/error.log {
   rotate 5
   mail 
www@my.org
   errors www@my.org
   size=100k
   sharedscripts
   postrotate
             /sbin/killall -HUP httpd
   endscript
}

/var/log/news/* {
   monthly
   rotate 2
   missingok
   errors 
newsadmin@my.org
   postrotate
             kill -HUP `cat /var/run/inn.pid`
   endscript
   nocompress
}


제일 첫줄은 코멘트이고 다음 2줄은 logrotate 전체의 옵션이다. 즉, 로그 파일 처리중 발생하는 오류는sysadmin@my.org에게 메일로 알리고 로그 파일은 압축하는것을 기본으로 한다는 내용이다.

다음은 각각의 로그 파일에 대해 처리 옵션을 지정하고 있다.
먼저 /var/log/messages란 로그 파일은 1주일에 한번씩 새로운 로그 파일을 만들고(weekly) 이전 파일은 5주간 보관한 다음 제거한다.(rotate 5) 로그 파일이 새로 생성된 다음에는 /sbin/killall -HUP syslogd 명령이 실행된다. (postrotate ... endscript)

다음은 /var/log/httpd/access.log 와 /var/log/httpd/error.log 2개의 파일을 함께 지정하고 있다. 이들 파일은 크기가 100K 이상으로 커지면 새로운 로그 파일을 생성하고(size=100k) 5개의 로그 파일을 보관한 다음(rotate 5) 가장 오래된 로그 파일은 제거하지 않고 압축되지 않은 상태로www@my.org에게 메일로 보내진다.(mail www@my.org) 로그 파일 처리중에 발생하는 오류는www@my.org에게 보고하고(errors www@my.org) 2개의 로그 파일을 같이 처리할 때 postrotate스크립트는 각 로그 파일을 처리할때 마다 실행되지 않고 한번만 실행된다(sharedscripts)는 내용이다. 만일 로그 파일에 공백문자가 포함된다면 처음과 같이 "로 둘러싸서 지정할 수 있다.

마지막은 /var/log/news 디렉토리 안의 모든 로그 파일들에 대한 지정이다. 각 로그 파일들은 1달에 1번씩 새로 만들어지고(monthly) 오류는 newsadmin@my.org에 게 보고된다. 로그파일이 없더라도 오류를 발생시키지 않으며(missingok) 보관하는 로그파일은 압축하지 않는다.(nocompress) 여러 파일들을 처리하더라도 앞에서 파일을 와일드 문자(*)로 지정했기 때문에 하나의 파일처리로 인식되며 몇가지 파일에서 오류가 발생하더라도 오류 메일은 한통이 보내진다.

다음은 설정파일에서 사용할 수 있는 명령어들중 일부이다.

compress
오래된 로그 파일들은 gzip으로 압축하여 보관한다. 압축을 원하지 않을 경우 nocompress를 사용하라.

copytruncate
보통 로그 파일 처리시에는 원래 로그 파일의 이름을 바꾸고 새로운 로그 파일을 생성하지만 이 옵션을 사용하면 현재 로그 파일의 내용을 복사하고 로그 파일의 크기를 0으로 만든다.

create mode owner group
postrotate 스크립트가 실행되기 전에 새로운 로그파일을 만들때 로그 파일의 mode, 사용자, 그룹을 지정한다. 기본으로는 원래 로그 파일과 같은 mode, 사용자, 그룹으로 새로운 로그 파일이 만들어진다.

daily, weekly, monthly
각각 매일, 매주, 매달 로그 파일을 처리한다.

errors 메일주소
로그 파일 처리시 발생한 오류를 메일주소로 알린다.

extension 확장자
보관한 로그파일의 확장자를 지정한다. 압축하는 경우에는 확장자 다음에 .gz이 붙게된다.
ifemtpy
기본값으로 르고 파일의 내용이 없더라도 새로운 로그 파일을 생성한다.

include 파일/디렉토리
파일의 경우 파일의 내용을 읽어들여서 처리하고 디렉토리의 경우 디렉토리 내의 모든 파일들을 읽어서 처리한다. 이 명령어는 전체설정에서만 사용할 수 있다. 디렉토리나 파이프와 같이 정규 파일이 아닌 것들과 뒤에서 설명할 tabooext의 확장자를 가지는 파일은 읽어들이지 않는다.
mail 주소
로그 파일의 보관 주기가 끝나면 주소로 로그 파일을 보낸다.
mailfirst
mail 주소 명령에서 보관 주기가 끝난 로그 파일이 아니라 방금 보관된 로그 파일을 메일로 보낸다.
missingok
로그 파일이 존재하지 않더라도 오류를 발생시키지 않는다.[/dl]]
[[dl]]nocopytruncate
copytruncate와 유사하게 작동하지만 보관할 로그 내용을 복사한 다음 현재 로그파일의 크기를 줄이지 않는다.
olddir 디렉토리
오래되서 보관해야 할 로그 파일이 저장될 디렉토리를 지정한다. 디렉토리는 로그 파일과 같은 물리적 장치에 존재해야 한다.[/dl]]
[[dl]]prerotate/endscript
두 명령사이에 위치하는 명령들을 로그 파일 처리전에 실행시킨다.
postrotate/endscript
로그 파일 처리후에 실행할 명령들을 지정한다.
sharedscripts
기본적으로는 로그파일을 처리할때마다 prerotate, postrotate 스크립트가 실행된다. 만일 여러 로그 파일을 처리하더라도 prerotate, postrotate 스크립트가 한번만 실행되기를 원한다면 이 명령어를 사용할 수 있다. 단, 이 명령어를 사용하면 처리된 로그 파일이 없더라도 prerotate, postrotate 스크립트가 한번 실행된다.
rotate 수
로그 파일은 지정한 수만큼 저장된 다음 제거되거나 메일로 보내진다. 만일 0을 지정하면 보관하지 않고 바로 처리한다.
size 크기
로그 파일의 크기가 지정한 크기 이상이 되면 처리한다. 크기는 M,k 단위를 사용하여 지정할 수 있다.
tabooext [+] 확장자들
include 문에서 읽어들이지 않을 파일의 확장자를 지정한다. 기본값으로는 .rpmorig,  .rpmsave, v, .swp, .rpmnew, ~이 지정되어 있으며 +를 사용하는 경우 현재 리스트에 확장자들을 추가한다.


출처 - http://blog.naver.com/PostView.nhn?blogId=hdd14&logNo=40090045609&redirect=Dlog&widgetTypeCall=true






참조 원문 : Setting Up Logrotate on RedHat Linux 

1. 소개
  Logrotate는 로그가 많이 쌓이는 상용 서버를 관리하는 관리자를 위한 유틸리티로 디스크 공간을 아끼면서 시스템이 용량 부족으로 뻗는 것을 방지합니다. 일반적으로 이런 문제를 막는 방법은 /var 마운트 포인트를 별도의 파티션이나 로지컬 볼륨으로 설정하는 것이지만 logrotate는 로그 파일을 일정 조건에 따라 다음 파일로 순환시키고 관리하여 해결합니다. 기본적으로 logrotate는 /etc/cron.daily/에 있는 cron 파일을 통해 하루에 한 번씩 실행됩니다.

$ ls -al /etc/cron.daily/logrotate 
-rwxr-xr-x 1 root root 372 12월  1  2012 /etc/cron.daily/logrotate


2. Logrotate 설정
  Logrotate를 설정하려면 아래 두 파일을 수정해야 합니다.

  • /etc/logrotate.conf
  • /etc/logrotate.d/ 디렉토리에 있는 서비스별 설정 파일

  /etc/logrotate.conf 파일은 일반 및 디폴트 설정을 담고 있습니다. 어떤 로그 파일에 대한 설정에서 관련 항목이 없다면 그 항목은 이 파일에 있는 내용을 따릅니다. 아래는 파일 내용의 예입니다.

# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
    missingok
    monthly
    create 0664 root utmp
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0660 root utmp
    rotate 1
}

# system-specific logs may be configured here
  • weekly : 로그 파일을 주 단위로 순환시킨다.
  • rotate 4 : 4주 분량의 로그 파일을 보관한다.
  • create : 순환 후 새로운 빈 로그 파일을 생성한다.
  • include : 해당 디렉토리에 있는 파일들을 읽어서 적용한다.

  /etc/logrotate.d/ 디렉토리에는 각 서비스별 설정 파일이 있습니다.

3. 새로운 서비스의 로그를 logrotate의 관리하에 두기
  /var/log/sample.log라는 로그 파일이 있고 이 파일을 매일 순환시키길 원한다고 가정하면 /etc/logrotate.d/ 디렉토리에 새로운 파일을 생성(파일명은 원하는 것으로 생성하나 보통은 서비스명을 사용)하여 아래의 내용을 작성하여 저장합니다.

/var/log/linuxcareer.log {
    missingok
    notifempty
    compress
    size 20k
    daily
    create 0600 root root
}

  참고로 같은 디렉토리에 있는 다수의 로그 파일에 같은 설정을 적용하길 원한다면 와일드카드(*)를 사용할 수 있습니다. 예를 들어 파일명에 /var/log/mylogs/*.log 라고 적는다면 /var/log/mylogs/ 디렉토리 안에 .log 확장자를 가진 모든 파일을 순환시킵니다.

  위의 예제에 있는 각 항목에 대한 설명은 아래와 같습니다.

  • missingok : 로그 파일이 없어도 에러를 출력하지 않습니다.
  • notifempty : 파일이 비어있다면 순환하지 않습니다.
  • compress : 순환 대상을 gzip으로 압축합니다.
  • size : 로그 파일의 크기가 20k보다 클 때만 순환합니다.
  • daily : 매일 순환합니다.
  • create : 퍼미션은 600, 소유자와 소유 그룹은 root로 새로운 로그 파일을 생성합니다.

  그 외에도 많은 옵션이 존재하며 man logrotate를 통해 확인할 수 있습니다.



출처 - http://www.myservlab.com/195



'System > Linux' 카테고리의 다른 글

고급 Bash 스크립팅 가이드  (0) 2013.01.02
Linux VFS(Virtual File System Switch) 해부  (0) 2012.10.29
debian/ubuntu - iptables 저장 및 restore  (0) 2012.09.01
linux - iptables 설정  (0) 2012.09.01
linux - 소스(source) rpm 설치  (0) 2012.08.23
Posted by linuxism
,