- 개요
- 아래의 그림과 같이 IIS Logs및 Event Log등등을 SQL과 비슷하게 쿼리해서 Text file등등으로 출력하게 하는 콘솔 프로그램이다. UV/PV를 뽑아내거나 특정 이벤트로그의 내용을 취합하거나 할때 용이하다. 자세한 사용법이나 내용은 LogParser를 설치 후 '.chm파일'을 참고하면 된다. GUI를 지원하는 visual logparser도 있다.
- 참고 내용
- IIS log 합치기
- C:\> type *.log > all.log
- 대소문자 구분없이 특정 문자열 'memoservice'가 들어간 것만 모으기
- C:\> findstr /i “memoservice” all.log > memoservice.log
- IIS log 'ex100510.log'파일에서 호출한 URL(cs-uri-stem)별 호출수와 경과시간(milliseconds)추출 쿼리
- logparser "select cs-uri-stem, count(*), sum(time-taken) from ex100510.log group by cs-uri-stem" > out.txt
- 참고 URL
- LogParser 2.2 Download URL : http://www.microsoft.com/downloads/en/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07&displaylang=en
- LogParser 관련 설명 : http://kaistizen.net/EE/index.php/weblog/comments/log_parser
- LogParser의 소개와 개념 : http://ykei.egloos.com/4829001
- Visual LogParser 관련 : http://isnull.kr/post773.html
- Logparser를 이용한 IIS 로그 Forensic 방법 : http://coderant.egloos.com/2989217
- 개요
- 객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스에서 책임지도록 한다.
- 구조 예
- 소스
public class Unit {
protected void move() {
System.out.println("Unit move");
}
protected void attack() {
System.out.println("Unit attack");
}
}
public class Marine extends Unit {
protected void attack() {
System.out.println("Marine move");
}
protected void move() {
System.out.println("Marine attack");
}
}
public class Battlecruiser extends Unit {
protected void attack() {
System.out.println("Battlecruiser move");
}
protected void move() {
System.out.println("Battlecruiser attack");
}
}
public abstract class Factory {
abstract Unit createUnit();
public void operation() {
Unit unit = createUnit();
unit.move();
unit.attack();
}
}
public class Barrack extends Factory {
Unit createUnit() {
return new Marine();
}
}
public class StarPort extends Factory {
Unit createUnit() {
return new Battlecruiser();
}
}
public class Client {
public static void main(String[] args) {
Factory barrack = new Barrack();
barrack.operation();
Factory starPort = new StarPort();
starPort.operation();
}
}
- 구현 관련
- Unit이 추가될때 마다 Unit의 SubClass와 Factory의 SubClass가 추가된다. 이렇게 하지 않는 방법중에 하나는 다음과 같은 것도 있다. 단점으로는 '객체지향 소프트웨어 설계 5원칙중' OCP를 위반한다. 즉, Unit이 추가될 때 코드의 수정이 일어난다.
- c++에서는 Barrack과 StarPort class에 대해 다음과 같이 template 기법을 사용해도 된다.
- template <class T>
- class ConcreateFactory : public Factory {
- protected :
- Unit* createUnit() {
- return new T;
- }
- }
- // 사용할 때 ==>
- // ConcreateFactory<Marine> marine;
- // marine.operation();
- 위의 예는 operation()가 template method와 같이 로직을 구현한 부분이다. 로직이 없는 경우에는 operation()이 없어도 된다.
- 차이점
- abstrat factory와 비슷하지만 families(집단, 군)를 강조하지 않는다.
- factory method는 상속으로 객체를 생성하고, prototype은 delegation로 객체를 생성한다.
- 참고
- factory method 설명 : http://sourcemaking.com/design_patterns/factory_method
- c# example : http://sourcemaking.com/design_patterns/factrory_method/c%2523
- c++ example : http://sourcemaking.com/design_patterns/factory_method/cpp/1
- indexer를 사용한 c++ example : http://sourcemaking.com/design_patterns/factory_method/cpp/2
- wikipedia : http://en.wikipedia.org/wiki/Factory_method_pattern
-
- 개요 : 객체를 생성하되 그 객체를 구성하는 부분 부분을 먼저 생성(아래에서는 buildHead, buildBody, buildFoot)하고, 이를 조합함으로서 전체 객체를 생성하는 패턴
- 구조 예
- 소스
public abstract class ACharacterBuilder {
protected Character character = null;
abstract void buildHead();
abstract void buildBody();
abstract void buildFoot();
public void createNewCharacter() {
this.character = new Character();
}
public Character getResultCharacter() {
return this.character;
}
}
public class HumanBuilder extends ACharacterBuilder {
void buildBody() {
this.character.setBody("인간몸 생성");
}
void buildFoot() {
this.character.setFoot("인간발 생성");
}
void buildHead() {
this.character.setHead("인간머리 생성");
}
}
public class MonsterBuilder extends ACharacterBuilder {
void buildBody() {
this.character.setBody("괴물몸 생성");
}
void buildFoot() {
this.character.setFoot("괴물발 생성");
}
void buildHead() {
this.character.setHead("괴물머리 생성");
}
}
public class Character {
private String head = "";
private String body = "";
private String foot = "";
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getFoot() {
return foot;
}
public void setFoot(String foot) {
this.foot = foot;
}
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public void show() {
System.out.println(getHead());
System.out.println(getBody());
System.out.println(getFoot());
}
}
public class Director {
public void construct(ACharacterBuilder chracterBuilder) {
chracterBuilder.createNewCharacter();
chracterBuilder.buildHead();
chracterBuilder.buildBody();
chracterBuilder.buildFoot();
}
}
public class Client {
public static void main(String[] args) {
ACharacterBuilder humanBuilder = new HumanBuilder();
ACharacterBuilder monsterBuilder = new MonsterBuilder();
Director director = new Director();
// 인간생성
System.out.println("===== 인간생성 시작 =====");
director.construct(humanBuilder);
Character humanA = humanBuilder.getResultCharacter();
humanA.show();
System.out.println("===== 괴물생성 시작 =====");
director.construct(monsterBuilder);
Character monsterA = monsterBuilder.getResultCharacter();
monsterA.show();
}
}
- 구현관리
- Character(Product)의 속성이 변경되면 ACharacterBuilder와 구현클래스들의 변경이 있게 되므로 Character(Product)의 속성에 대한 설계를 명확히 하는것이 중요하다. Character(Product)를 인덱서 형식으로 만들면 Character(Product) 클래스의 변경은 없을것 같다. (위의 예에서는 Character 에 map<string, string>을 가지고 있고 map을 추가하고 조회하는 메소드를 만들면 추후 Charater에 멤버를 추가 및 삭제할 때 Character class의 소스를 수정할 일이 없다.)
- Character(Product)가 여러개일 경우에는 ICharacter와 같이 추상화해서 사용해도 괜찮을것 같다.
- 참고