Próbuję dołączyć ciąg do pliku dziennika. Jednak writeFile usunie zawartość za każdym razem przed zapisaniem ciągu.
fs.writeFile('log.txt', 'Hello Node', function (err) {
if (err) throw err;
console.log('It\'s saved!');
}); // => message.txt erased, contains only 'Hello Node'
Masz pomysł, jak to zrobić w prosty sposób?
process.exit()
zaraz po tymfs.appendFile
, możesz wyjść przed wysłaniem danych wyjściowych. (Używaniereturn
jest w porządku.)appendFileSync
. nodejs.org/api/… Ale możesz stracić jedną z wielkich zalet Node, jaką są operacje asynchroniczne. Upewnij się, że łapiesz błędy. Być może w niektórych systemach operacyjnych możesz odmówić dostępu, jeśli jednocześnie żądasz uchwytu pliku. Nie jestem tego pewien.Kiedy chcesz zapisywać w pliku dziennika, tj. Dołączać dane na końcu pliku, nigdy nie używaj
appendFile
.appendFile
otwiera uchwyt pliku dla każdego elementu danych, który dodajesz do pliku, po chwili pojawia się pięknyEMFILE
błąd.Mogę dodać, że
appendFile
nie jest łatwiejszy w użyciu niżWriteStream
.Przykład z
appendFile
:Do 8000 na moim komputerze możesz dołączyć dane do pliku, a następnie uzyskasz:
Co więcej,
appendFile
zapisze, gdy jest włączony, więc dzienniki nie będą zapisywane według znacznika czasu. Możesz przetestować na przykład, ustawić 1000 zamiast 100000, kolejność będzie losowa, zależy od dostępu do pliku.Jeśli chcesz dołączyć do pliku, musisz użyć zapisywalnego strumienia w następujący sposób:
Kończysz to, kiedy chcesz. Nie musisz nawet używać tej
stream.end()
opcji, domyślną opcją jestAutoClose:true
, więc plik zakończy się po zakończeniu procesu i unikniesz otwierania zbyt wielu plików.źródło
stream.end()
przedstream.write()
, więc nie powinniśmy używaćstream.end()
, również, jak wspomniałeś,AutoClose:True
jest to opcja domyślna, więc po co zawracać sobie głowę pisaniem linii, która nie ma znaczenia posługiwać się.due to asynchronous nature of Javascript
... Co? Array.forEach to operacja synchroniczna. JS jest synchroniczny. Zdarza się, że zapewniają pewne sposoby zarządzania operacjami asynchronicznymi, takie jak obietnice i asynchronizacja / oczekiwanie.fs.appendFile
spowoduje to zbyt wiele otwartych plików, ponieważ wykonujesz je w sposób asynchroniczny (po prostu asynchronicznie tworzysz uchwyt pliku 10000), uważam,appendFileSync
że nie miałby podobnego problemu, równieżfs.appendFile
z niewłaściwym interwałem (1s jest prawdopodobnie więcej niż wystarczające) lub w kolejce.Twój kod za pomocą createWriteStream tworzy deskryptor pliku dla każdego zapisu. log.end jest lepszy, ponieważ prosi węzeł o zamknięcie natychmiast po zapisie.
źródło
var fs = require('graceful-fs')
, co rozwiało niektóre znane problemy. Zobacz dokumentację, aby uzyskać więcej informacji.fs.createWriteStream
, użyjflags
. Jeśli używasz,fs.writeFile
to jestflag
. Więcej informacji można znaleźć w dokumencie Węzły Dokumenty JS - System plików .Poza tym
appendFile
możesz również przekazać flagę,writeFile
aby dołączyć dane do istniejącego pliku.Przekazywanie flagi „a” spowoduje dołączenie danych na końcu pliku.
źródło
fs.createWriteStream
, użyjflags
. Jeśli używasz,fs.writeFile
to jestflag
. Więcej informacji można znaleźć w dokumencie Węzły Dokumenty JS - System plików .Musisz go otworzyć, a następnie napisać do niego.
Oto kilka linków, które pomogą wyjaśnić parametry
otwórz
napisz
zamknij
EDYCJA : Ta odpowiedź nie jest już poprawna, spójrz na nową metodę fs.appendFile do dołączania.
źródło
Node.js 0.8 ma
fs.appendFile
:Dokumentacja
źródło
źródło
Jeśli chcesz w łatwy i bezstresowy sposób zapisywać logi linia po linii w pliku, polecam fs-extra :
Testowane z Node v8.9.4.
źródło
Moje podejście jest raczej wyjątkowe. Zasadniczo korzystam z
WriteStream
rozwiązania, ale bez „zamykania” fd za pomocąstream.end()
. Zamiast tego używamcork
/uncork
. Zaletą tego jest niskie zużycie pamięci RAM (jeśli ma to znaczenie dla każdego) i uważam, że bezpieczniej jest używać go do logowania / nagrywania (mój oryginalny przypadek użycia).Poniżej znajduje się dość prosty przykład. Zauważ, że właśnie dodałem pseudo-
for
pętlę do prezentacji - w kodzie produkcyjnym czekam na wiadomości websocket.uncork
opróżni dane do pliku w następnym tiku.W moim scenariuszu występują szczyty do ~ 200 zapisów na sekundę w różnych rozmiarach. W nocy potrzeba jednak tylko kilku zapisów na minutę. Kod działa bardzo niezawodnie nawet w godzinach szczytu.
źródło
Oferuję tę sugestię tylko dlatego, że kontrola nad otwartymi flagami jest czasami przydatna, na przykład możesz najpierw obciąć istniejący plik, a następnie dołączyć do niego serię zapisów - w takim przypadku użyj flagi „w” podczas otwierania pliku i nie zamykaj go, dopóki wszystkie zapisy nie zostaną wykonane. Oczywiście appendFile może być tym, czego szukasz :-)
źródło
Korzystanie z pakietu jfile :
źródło
Używanie
fs.appendFile
lubfsPromises.appendFile
jest najszybszymi i najbardziej niezawodnymi opcjami, gdy trzeba dołączyć coś do pliku.W przeciwieństwie do niektórych sugerowanych odpowiedzi, jeśli ścieżka do pliku jest dostarczona do
appendFile
funkcji, faktycznie się zamyka . Dopiero po przejściu do uchwytu pliku, który dostajesz przez coś takiegofs.open()
, musisz zadbać o jego zamknięcie.Próbowałem z ponad 50 000 wierszy w pliku.
Przykłady:
Ref: https://github.com/nodejs/node/issues/7560
Przykład wykonania: https://github.com/apickjs/apickFS/blob/master/writeLines.js
źródło
Oto pełny skrypt. Wpisz nazwy swoich plików i uruchom je, a powinno działać! Oto samouczek wideo na temat logiki skryptu.
źródło
łatwiej to zrobić
źródło
appendFileSync
rozwiązanie?źródło
Oprócz odpowiedzi denysonique , czasem
appendFile
w NodeJS stosowane są czasem metody asynchroniczne i inne metody asynchroniczne, w których obietnica powraca zamiast przekazywania wywołania zwrotnego. Aby to zrobić, musisz owinąć funkcjępromisify
HOF lub zaimportować funkcje asynchroniczne z przestrzeni nazw obietnic:Mam nadzieję, że to pomoże 😉
źródło