셸의 출력물을 텍스트 파일에 써서 필요한 레코드를 유지해야합니다. 누구든지이 일을 어떻게 할 수 있는지 말해 주시겠습니까?Erlang : 내 출력을 텍스트 파일에 쓰는 방법?
감사
셸의 출력물을 텍스트 파일에 써서 필요한 레코드를 유지해야합니다. 누구든지이 일을 어떻게 할 수 있는지 말해 주시겠습니까?Erlang : 내 출력을 텍스트 파일에 쓰는 방법?
감사
당신이 하나의 용어로 저장하고자하는 데이터가있는 경우는 here 방법을 읽을 수 있습니다. 가장 간단한 경우에는 file:write_file(Path, Data)
을 사용할 수 있습니다. 데이터가 더 복잡한 경우 io_lib:fwrite/2
을 사용하면보다 쉽게 읽을 수있는 형식으로 서식을 지정할 수 있습니다. 예를 들어 :
Data = [1,2,3,{car, "honda"}],
file:write_file("/tmp/foo", io_lib:fwrite("~p.\n", [Data])).
tee 명령은 쉘 출력을 캡처 할 수 있으며 파일에 저장 :
$ erl | tee output.txt
Eshell V5.8 (abort with ^G)
1> A = 5.
5
2> 5 + A.
10
3> ^Ca
$ cat output.txt
Eshell V5.8 (abort with ^G)
1> 5
2> 10
3>
는 많은 가능성이 있습니다. 여기 내 마음에 온 첫 번째가 있습니다.
얼랑에서 모든 프로세스는 그룹의 일부입니다. 각 그룹에 대해 이라는 그룹 리더 인 프로세스이 그룹 메이트의 모든 출력을 가져옵니다. 쉘 프로세스는 init 그룹의 일부입니다. 그래서, 당신이 할 수있는 것은 수행하여 쉘 프로세스에 대한 change the group leader이다 :
{ok, Log} = file:open("log", [write]),
erlang:group_leader(Log, self()).
당신은 더 영리한 방법으로 출력을 관리하는 그룹 리더 역할을하는 전용 프로세스를 생성 할 수 있습니다. 예를 들어, 잠시 후 또는 파일이 특정 크기에 도달하면 파일을 감쌀 수 있습니다.
이 방법의 문제점은 쉘을 시작할 때마다이 줄을 실행해야한다는 것입니다.
이가 ERL -s shell_log shell_log가
가 :
이 이-module(shell_log).
-export([start/0]).
start() ->
{ok, Log} = file:open("log", [write]),
erlang:group_leader(Log, self()).
이 (초기화 아직도 여전히 너무 일찍 때문에
가 작동하지 않습니다 입니다 -s 플래그를 사용하여 작업 수행 init:get_status()
에 의해보고 된 바와 같이 {starting, started}
에 있음).
마찬가지로, 홈 디렉토리의 .erlang
파일 (쉘을 시작할 때마다 자동으로 실행되는 파일)을 사용하면 비슷한 이유 (init는 여전히 {starting, applications_loaded}
상태 임)로 실패합니다.
이 문제를 우회하는 가장 좋은 방법은 무엇인지 잘 모릅니다. 나는 그것에 대해 생각합니다.
마지막으로이 질문은 this thread과 중복됩니다.
[this] (http://stackoverflow.com/questions/3718101/logging-libraries-for-erlang-otp/3720373#3720373)? – nmichaels