text 형태가 아닌 파일을 grep 했을 때 발생하는 에러.

> cat engine.log | grep 502

> Binary file (standard input) matches 

 

파일 형식은 아래와 같이 확인이 가능

> file engine.log

> engine.log: ASCII English text, with very long lines

출처 : https://unix.stackexchange.com/questions/335716/grep-returns-binary-file-standard-input-matches-when-trying-to-find-a-string

 

 

-a 옵션을 붙여주어 해결

> cat engine.log | grep 502 -a

> 결과생략

 

출처 : https://bbs.archlinux.org/viewtopic.php?id=32328

반응형

보통 서버 로그를 분석하는 툴(awstats 등)을 서버내에 설치하거나

로그를 다운받은 후 로그 분석 툴을 돌려 로그를 분석하는 걸로 알고있다.

 

하지만 분석을 excel 로 할 테니, 서버 로그를 row 데이터로 뽑아 달라는 갑의 요구사항이 있었다..

(운영은 자기네들이 하면서 왜 이걸 나한테 하라고.....)

 

 

1. 로그에서 필요한 부분들만 발췌하여 row 데이터로 만들어 주는 shell script 를 짠다.

[로그 형식]

2019-04-15 18:50:37,511 INFO  [stdout] (default task-40) INFO : com.test.sample.interceptor.ControllerAOP - # RESPONSE | CONTROLLER = ApiController | METHOD = /mobile/api/getvoddata | RESULT = success | REMOTEADDR = 127.0.0.1 | PORT = 8082 | TIME = 9 ms | IN_PARAMS = {key1=value1, key2=value2, key3=value3} | OUT_PARAMS = {key1=value1, key2=value2}

서버 로그가 위와 같이 쌓이고 있다.

서버 로그에서 불필요한 부분들(검은색 폰트)은 제거하고 남길 데이터들(빨강색 폰트)만 row데이터로 남겨, txt 파일을 생성하는 shell script를 만들어보자.

 

makelowdata.sh 파일 생성

> touch makelowdata.sh 

makelowdata.sh 파일 vi 모드로 편집

> vi makelowdata.sh

 

쉘스크립트 실행시

첫번째 매개변수를 분석대상로그파일,

두번째 매개변수를 추출할 row 데이터의 시작기준시각,

세번째 매개변수를 추출할 row 데이터의 종료기준시각

으로 가정하고 작성

 

[작성 완료한 makelowdata.sh 쉘스크립트]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/bin/sh
LOG_FILE=$1
FROM_TIME=$2
END_TIME=$3
 
if [ $LOG_FILE ] ;
        then
        echo "LOG_FILE is null"
fi
 
if [ $FROM_TIME ] ;
        then
        echo "FROM_TIME is null"
fi
 
if [ $END_TIME ] ;
        then
        echo "END_TIME is null"
fi
 
 
echo "---------------------------------------"
echo "analysing logging starts... "
echo "target log file : $1"
 
if [ -f logrowdata_$2_$3.txt ] ;
       then
           echo "logrowdata_$2_$3 exists"
           exit
        else
           touch logrowdata_$2_$3.txt
fi
 
 
 
var1=`awk -v frd="$FROM_TIME" -v et="$END_TIME" 'frd <= $2 && $2 <= et' $LOG_FILE | grep -'success|fail' | sed 's/IN_PARAMS = //' | sed 's/OUT_PARAMS = //' | awk '{print $1 "\t" $2 "\t" $9 "\t" $16 "\t" $20 "\t" $24 "\t" $28 "\t" $32 "\t" $36}'`
var2=`awk -v frd="$FROM_TIME" -v et="$END_TIME" 'frd <= $2 && $2 <= et' $LOG_FILE | grep -'success|fail' | sed 's/IN_PARAMS = //' | sed 's/OUT_PARAMS = //' | cut -d'|' -f8-9 | sed 's/|/\t/'`
 
 
if [ -f var1.txt ] ;
     then
         rm ./var1.txt
fi
 
if [ -f var2.txt ] ;
     then
         rm ./var2.txt
fi
 
 
echo "$var1" > var1.txt
echo "$var2" > var2.txt
 
 
paste -"\t" var1.txt var2.txt > logrowdata_$2_$3.txt
 
 
 
 
 
 
rm var1.txt var2.txt
 
 
echo "analysing logging has been finished... "
echo "---------------------------------------"
 
cs

 

 

[해석]

6~9 line : 매개변수 1 유효성검사

11~14 line : 매개변수 2 유효성검사 (시간 형식 체크는 굳이 하지 않음..)

16~19 line : 매개변수 2 유효성검사 (시간 형식 체크는 굳이 하지 않음..)

26~32 line : 결과물인 logrowdata_시작시각_종료시각.txt 파일 존재여부 확인 후, 존재할 경우 해당 파일 삭제, 존재하지 않을 경우 파일 생성

-f filename : 파일 존재할 시 true 리턴

36 line : 로그 파일(매개변수 1)에서 필요부분 추출 후 var1 변수에 선언

[한 줄 씩 해석]

1) var1=

>> var1 변수 선언 및 저장

2) `awk -v frd="$FROM_TIME" -v et="$END_TIME" 'frd <= $2 && $2 <= et' $LOG_FILE | 

awk -v 변수="값" -v 변수="값" '정규식' 파일

>> 전역변수 $LOG_FILE 의 파일 중 2번째 필드($2) 가 frd 보다 크거나 같고 et 보다 작거나 같은 row만 뽑는다. 

>> 전역변수 $FROM_TIME, $END_TIME을 각각 frd, et 변수에 저장, awk 정규식 내에서 변수로 사용 (awk -v 옵션 사용)

3) grep -E 'success|fail' | 

grep -E '문자열 조건 문자열'

>>  2)번으로 부터 전달받은 문자열 중, success 혹은 fail 문자열이 포함된 row만 뽑는다. (grep -E 옵션 사용)

4) sed 's/IN_PARAMS = //' | 

sed 's/치환대상문자열/대체문자열/'

>> 3)번으로 부터 전달받은 문자열에서 "IN_PARAMS = " 값을 ""로 치환한다. (sed 's~' 사용)

sed 's/OUT_PARAMS = //' | 

>> 위와 동일

5) awk '{print $1 "\t" $2 "\t" $9 "\t" $16 "\t" $20 "\t" $24 "\t" $28 "\t" $32 "\t" $36}'`

>> 4) 단계 까지 처리한 row 에서 1,2,9,16,20,24,28,32,36 번째 필드를 중간중간 탭("\t") 구분자를 두어 출력 

 

37 line : 로그 파일(매개변수 1)에서 필요부분 추출 후 var2 변수에 선언

[한 줄 씩 해석]

1) var2=

>> var2 변수 선언 및 저장

2) `awk -v frd="$FROM_TIME" -v et="$END_TIME" 'frd <= $2 && $2 <= et' $LOG_FILE | 

awk -v 변수="값" -v 변수="값" '정규식' 파일

>> 전역변수 $LOG_FILE 의 파일 중 2번째 필드($2) 가 frd 보다 크거나 같고 et 보다 작거나 같은 row만 뽑는다. 

>> 전역변수 $FROM_TIME, $END_TIME을 각각 frd, et 변수에 저장, awk 정규식 내에서 변수로 사용 (awk -v 옵션 사용)

3) grep -E 'success|fail' | 

grep -E '문자열 조건 문자열'

>>  2)번으로 부터 전달받은 문자열 중, success 혹은 fail 문자열이 포함된 row만 뽑는다. (grep -E 옵션 사용)

4) sed 's/IN_PARAMS = //' | 

sed 's/치환대상문자열/대체문자열/'

>> 3)번으로 부터 전달받은 문자열에서 "IN_PARAMS = " 값을 ""로 치환한다. (sed 's~' 사용)

sed 's/OUT_PARAMS = //' | 

>> 위와 동일

5) cut -d'|' -f8-9 | 

cut -d'구분문자' -f추출할인덱스

>> 4) 단계 까지 처리한 row 에서 "|" 문자 기준으로 문자열을 분류하여(java split 함수와 비슷) 8~9 번째 문자열만 뽑는다. (cut -d -f 옵션 사용)

6) sed 's/|/\t/'` 

>> 5) 단계 까지 처리한 row 에서 "|" 문자열을 탭("\t")으로 치환

 

40~43 line : var1.txt 파일 존재시 삭제

45~48 line : var2.txt 파일 존재시 삭제

51 line : var1 변수를 var1.txt 파일로 생성

52 line : var2 변수를 var2.txt 파일로 생성

55 line : 탭("\t")을 구분으로 하여 var1.txt, var2.txt 파일을 합친 후(각각의 로우 기준으로 append), logrowdata_매개변수2_매개변수3.txt 파일로 저장

>> paste -d "\t" 파일1 파일2 > 결과파일 : -d 옵션을 사용하여 특정 문자를 구분자로 사용하여 두 문자열을 합친 후 결과파일로 생성

62 line : 임시 파일로 생성했던 var1.txt, var2.txt 를 삭제

 

 

2. 1번 쉘스크립트를 돌려 row 파일 생성

위에서 작성한 쉘스크립트 실행

> ./makelowdata.sh server.log 18:00 19:00

( server.log 로그파일에서 18:00 ~ 19:00시 사이의 로그만 추출 ) 

[쉘스크립트로 추출한 로그]

2019-04-15 18:30:37,511  com.test.sample.interceptor.ControllerAOP  ApiController  

/mobile/api/getvoddata  success  127.0.0.1  8082  9  {key1=value1, key2=value2, key3=value3}  {key1=value1, key2=value2}

 

3. 2번에서 생성한 row 파일을 엑셀 파일로 변환

1) 쉘스크립트로 생성한 txt 파일을 엑셀 파일로 연다.

2) "구분 기호로 분리됨" 선택, char encoding "949 : 한국어" 선택

3) 구분 기호 "탭" 선택

4) 열 데이터 서식 "텍스트" 선택

4. 필터등을 적용하여 분석한다.

분석은 알아서.

 

 

awk 로 로그 뽑을 줄 알았다면 로그 찍을 때 스페이스바 난사를 하지 않았을텐데.. 다음엔 이러지 말아야지.

책 사서 리눅스 공부도 해야겠다..

 

반응형

[기본 명령어]

1. OS 확인

grep . /etc/*-release

 

2. ip 확인

ifconfig

 

3. 계정생성

useradd 계정명

 

4. 계정패스워드변경

passwd 계정명

 

5. 파일 및 폴더에 권한 부여

chmod 755 파일명

 

유저(user)   : read 읽기(4) write 쓰기(2) execute 실행(1) = 4 + 2 + 1 = 7

그룹(group) : read 읽기(4) write 쓰기(2) execute 실행(1) = 4      + 1 = 5

기타(other)  : read 읽기(4) write 쓰기(2) execute 실행(1) = 4      + 1 = 5

Ex]
> chmod 755 start.sh

start.sh 파일에 대해
유저는 읽기(4) 쓰기(2) 실행(1),
그룹은 읽기(4) 실행(1),
기타는 읽기(4) 실행(1) 권한을 부여

 

6. 파일 및 폴더의 소유자 변경

chown 소유계정:소유그룹 파일명

 

ex) chown jboss:jboss start.sh

start.sh 파일에 대한 소유권을 jboss 계정, jboss 그룹으로 바꾼다.

 

7. 파일 읽기

cat 파일명;

 

8. 파일 찾기

find -name '*log*'

: 현재 디렉토리 하위에서 log 문자열이 포함된 파일명 기준으로 찾기

 

* grep

: 보통 grep 만 사용하는 경우는 드물고 파이프(|)와 같이 사용함.

Ex]
grep '기준이되는문자열'
grep -v '제외시킬 문자열'
grep -e '기준문자열1||기준문자열2'
grep -A 3 -B 1 '기준이되는문자열' : -A(after) 기준문자열 뒤로 3줄 -B(before) 이전 1줄까지 출력
cat '파일' | grep '파일내에 찾을 문자열'

9. 삭제

파일 제거

rm 파일명

디렉토리제거

rmdir 디렉토리명

파일 및 디렉토리 전부삭제

rm -rf 디렉토리명

 

프로그램설치

yum : CentOS

apt : Ubuntu

 

10. 압축

.zip 파일 현재위치에 풀기

> unzip file.zip -d .

 

11. 복사 관련

1) directory 통째로 복사

cp -r ./directory .

(omitting ~ 관련 에러가 날 경우 -r 옵션주기)

 

 

<mysql 관련>

1. mysql 접속

mysql -u mysql아이디 -p

 

2. 데이터베이스(스키마) 보기

show databases;

 

3. use 데이터베이스명(스키마);

 

4. 테이블목록 보기

show tables;

 

 

[vi (linux visual editor) 관련]

1. vi 실행

vi 파일명

 

* 좌측 line number 보기

:set number

 

2. 문서 끝으로 이동

G (입력모드아닌 상태에서)

:$

 

2-1. 문서 첫 부분으로 이동

gg (입력모드아닌 상태에서)

 

3. 특정 문자를 찾아 해당 문자 위치로 이동

3-1. 순차검색

:/ 찾을문자열

3-2. 역순검색 

:? 찾을문자열 

 

3-1. 문자 찾기 커서 이동(이전/다음 문자로 이동)

방향대로 이동: n

역방향으로 이동: N

Ex] server.log 파일에서 exception 이 들어간 문자열을 vi 모드에서 찾고싶은 경우

1. 문서의 끝에서 부터 찾기(backward 방향으로 서칭하기)
> vi server.log
> :$
>:?exception
n (현재 탐색 방향(backward)으로 이동하며 exception 문자열이 포함된 부분으로 커서 이동 
N (현재 탐색 방향과 반대방향(forward)으로 이동하며 exception 문자열이 포함된 부분으로 커서 이동

2. 문서의 시작점부터 찾기(forward 방향으로 서칭하기)
>vi server.log
(입력모드 아닌 상태에서) gg 
>:/exception
n (현재 탐색 방향(forward)으로 이동하며 exception 문자열이 포함된 부분으로 커서 이동
N (현재 탐색 방향과 반대방향(backward)으로 이동하며 exception 문자열이 포함된 부분으로 커서 이동

 

4. 문자 지우기

delete 키

한줄 지우기 : 입력모드아닌 상태에서 dd

 

5. 문자열 치환 

%s/대상문자열/치환할문자열/g (전역치환)

%s/대상문자열/치환할문자열/i (대소문자구분없이 치환)

 

6. 문자 입력 (INSERT 모드로 전환)

i 입력

INSERT 모드 종료는 ctrl + c 혹은 esc

 

7. 종료

6-1. 저장 후 종료

:wq

6-2. 저장

:w

6-3. 저장 없이 종료

:q!

 

[crontab 관련]

crontab [-u user] file
        crontab [-u user] [ -e | -l | -r ]
                (default operation is replace, per 1003.2)
        -e      (edit user's crontab)
        -l      (list user's crontab)
        -r      (delete user's crontab)
        -i      (prompt before deleting user's crontab)
        -s      (selinux context)

1. crontab -l

목록보기

 

2. crontab -e

edit 모드

 

3. crontab -r 

전체 제거

*사용 자체를 하지말 것

 

 

[네트워크 관련]

1. 네트워크 상태 보기 

netstat

 

2. 방화벽 확인

2-1. telnet ip port

현재 서버에서 ip port 에 대한 방화벽 확인

telnet 종료키 : ctrl + ]

 

2-2. ping domain or ip

현재 서버에서 domain 에 대한 ping 확인, ip 알아내기

ex]

> ping naver.com

> Ping naver.com [210.89.164.90] 32바이트 데이터 사용:

> telnet 210.89.164.90 80

> ctrl + ]

 

2-3. netstat -tnlp

열려있는 포트 확인

 

<프로세스 관련>

1. 프로세스 확인

ps -ef

 

2. 프로세스 중 특정 프로세스만 확인

ps -ef | grep 프로그램명

파이프(|) 사용

 

3. 프로세스 죽이기

kill -9 프로세스번호

*프로세스 번호는 ps -ef | grep 프로그램명 으로 확인

 

4. 서버 상태 확인(CPU, RAM 등)

top

 

<방화벽 관련>

firewalld : CentOS

ufw : Ubuntu

서버 ftp 설정 (vsftpd): 참고

 

[bash 관련]

which/whereis/locate 참고

1. which

명령어의 위치 찾기

which find

which -a find

 

2. whereis

명령어의 실행파일위치, 소스위치, man 파일위치

whereis find

 

3. locate

패턴 사용하여 파일 위치 찾기

locate *.sh

locate -n 10 *.sh 패턴에 속한 파일 중에 지정한 개수만큼만 검색

 

 

반응형

맥주소 MAC ADDRESS 확인하기

 

1. 윈도우키+r

2. cmd 입력

3. ipconfig /all 입력 (아래 참고)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
C:\Users\user>ipconfig /all
 
Windows IP 구성
 
   호스트 이름 . . . . . . . . : JP
   주 DNS 접미사 . . . . . . . :
   노드 유형 . . . . . . . . . : 혼성
   IP 라우팅 사용. . . . . . . : 아니요
   WINS 프록시 사용. . . . . . : 아니요
 
이더넷 어댑터 이더넷:
 
   미디어 상태 . . . . . . . . : 미디어 연결 끊김
   연결별 DNS 접미사. . . . :
   설명. . . . . . . . . . . . : Qualcomm Atheros AR8161 PCI-E Gigabit Ethernet Controller (NDIS 6.30)
   물리적 주소 . . . . . . . . : 99-99-99-99-99-99
   DHCP 사용 . . . . . . . . . : 아니요
   자동 구성 사용. . . . . . . : 예
 
 
무선 LAN 어댑터 Wi-Fi:
 
   연결별 DNS 접미사. . . . :
   설명. . . . . . . . . . . . : Realtek RTL8723AE Wireless LAN 802.11n PCI-E NIC
   물리적 주소 . . . . . . . . : 99-99-99-99-99-99
   DHCP 사용 . . . . . . . . . : 예
   자동 구성 사용. . . . . . . : 예
   링크-로컬 IPv6 주소 . . . . : 
   IPv4 주소 . . . . . . . . . : ...
   서브넷 마스크 . . . . . . . : ...
   임대 시작 날짜. . . . . . . : 
   임대 만료 날짜. . . . . . . : 
   기본 게이트웨이 . . . . . . : 
   DHCP 서버 . . . . . . . . . : 
   DHCPv6 IAID . . . . . . . . : 
   DHCPv6 클라이언트 DUID. . . : 
   DNS 서버. . . . . . . . . . : 
                                 
   Tcpip를 통한 NetBIOS. . . . : 사용
 
cs

유선으로 인터넷을 사용하는 경우 : 이더넷 영역의 물리적 주소가 맥어드레스

와이파이로 인터넷을 사용하는 경우 : 무선 LAN 어댑터 영역의 물리적 주소가 맥어드레스

 

반응형

postman 을 사용하면 여러모로 편리하지만,

리눅스환경에서 외부 api를 호출해야 하는 경우, 아래와 같이 curl 로 호출해보면 된다.

 

1
2
3
4
5
6
7
8
9
1.GET 요청
curl -X GET --data-urlencode "key=value&key2=value2" http://ip:port
 
2.POST 요청
curl -X POST http://ip:port -d '{"objKey":"objValue", "arrayKey":["arrayValue1", "arrayValue2"]}'
 
3.DELETE 요청
curl -X DELETE http://ip:port/key
 
cs

 

[ 요청시 헤더 추가 ]

-H "Content-Type: application/json"

 

[ 요청시 connection timeout ]

--connect-timeout : 타임아웃설정을 걸고 싶을 경우

(따로 해당 옵션을 주지 않아도 default로 일정 시간이 적용되는 것 같다. hang이 알아서 풀린다..)

ex) curl --connect-timeout 300 -X GET ~

 

[ 응답시 헤더 확인 ]

-I : response 헤더정보 확인할 때 사용

(요청에 따른 return 값 없이 500, 404, 200 등의 responseCode만 리턴되는 경우 헤더정보를 보고 확인)

ex) curl -I -X DELETE http://ip:port/key

 

[ 요청 및 응답 세부 정보 확인 ]

-v : 요청한 파라미터 및 리턴 responseCode 등 상세한 request/response 정보를 보고 싶을 때 사용

 

반응형

+ Recent posts