2016-12-14 28 views
7

mam nodejs skrypt uruchomiony w produkcjibłędy Nodejs debugowania w produkcji

I mało prawdopodobne (raz na tysiąc razy) pojawiają się błędy tak:

TypeError: value is out of bounds 
    at checkInt (buffer.js:1009:11) 
    at Buffer.writeUInt16LE (buffer.js:1067:5) 
    at Object.foo.bar (/fake/path/name.js:123:1); 
    at Object.foo.bar2 (/fake/path/name2.js:123:1); 
    at Object.foo.bar3 (/fake/path/name3.js:123:1); 

Spowodowanie serwer produkcyjny do katastrofy ...

Świetnie, mam stacktrace! Ale chcę wiedzieć, jakie są aktualne dane dotyczące każdego połączenia lub wszystkich danych?

Co to są świetne narzędzia lub kod do użycia przy logowaniu błędów (z aktualnymi danymi) na kodzie produkcyjnym?

+0

proszę dodać OS używasz. W niektórych systemach operacyjnych można używać narzędzi do śledzenia, takich jak dtrace (smartos), itp., Aby zobaczyć, co dzieje się w produkcji bez dotykania kodu. –

Odpowiedz

4

yoou mogą korzystać Winston lub Pino

Z Winston można załadować wiele modułów do dziennika, w którym chcesz, a może bali sklepie internetowym. Nigdy nie używam pino, ale czytałem dobre rzeczy na ten temat.

Ustaw zmienne env, aby wybrać miejsce wyprowadzenia logu, na przykład nie będziesz wyświetlać danych wyjściowych na standardowe wyjście tylko wtedy, gdy jesteś w fazie rozwoju i przechowywania online tylko wtedy, gdy aplikacja jest w produkcji.

1

Dobrym sposobem, aby poradzić sobie z FUNKCJE asynchroniczny w node.js jest za pomocą decofun debug tool.

Jego główną cechą jest przetwarzanie kodu i nazw anonimowych funkcji zgodnie z ich kontekstem.

Można deanonymise dowolny anonimowy funkcja uruchamiając go z deco filename.js

Prostym przykładem byłoby jak wspomniano w documentation

function gravy() { 
    return function returnedᅠfromᅠgravyᅠㅣlineᅠ2() { 
     return { 
     prop: function asᅠpropertyᅠpropᅠㅣlineᅠ4() { 
      setTimeout(function passedᅠintoᅠsetTimeoutᅠㅣlineᅠ5() { 
      console.trace('Getting a trace...'); 
      }, 10) 

     } 
     } 
    } 
} 
Trace: Getting a trace... 
    at passedᅠintoᅠsetTimeoutᅠㅣlineᅠ5 [as _onTimeout] (/home/ubuntu/workspace/node_modules/decofun/examples/loadable/index.js:6:22) 
    at Timer.listOnTimeout (timers.js:92:15) 

Ponieważ pochodzi z wbudowanego cute-stack biblioteki, która normalizuje ścieżka do bieżącego katalogu

Stosując polecenie deco examples/loadable --cute table wyjście zostanie pokazane jako

enter image description here

Najlepiej lubię w nim to, że przekształca funkcje w oparciu o ich połączeń do pierwotnego jak widać w Przykład z tego

function one (a, cb) { 

} 


one('blah', function() { 

}) 

function two() { 
    return function() { } 
} 


function three() { 
    return { 
    shoe: function() {} 
    } 
} 

function four() { 
    return function() { 
    return function() { 

    } 
    } 
} 

function five() { 
    return function() { 
    return function() { 
     return function() { 
     foo('blue', function() { 

     }) 
     } 
    } 
    } 
} 


var six = function() { 

} 


var seven = function (err, cb) { 

    return function() { 
    cb(function() { 

    }) 
    } 

} 

var o = {}; 
o.eight = function (cb) { } 


o.eight(function() { }) 

o.eight.nine = function() {} 
o.eight.nine(function() { }) 

var o2; 

o2 = function() { } 


;(function() {}()) 

!function() { }() 



function toodeep() { 
    return function() { 
    return function() { 
     return function() { 

     return function() { 
      return function() { 
      return function() { 

       return function() { 
       return function() { 
        return function() { 

        return function() { 

        }      

        } 
       } 
       } 

      } 
      } 
     }   
     } 
    } 
    } 
} 

do tego

function one (a, cb) { 

} 


one('blah', function passedᅠintoᅠoneᅠㅣlineᅠ6() { 

}) 

function two() { 
    return function returnedᅠfromᅠtwoᅠㅣlineᅠ11() { } 
} 


function three() { 
    return { 
    shoe: function asᅠpropertyᅠshoeᅠㅣlineᅠ17() {} 
    } 
} 

function four() { 
    return function returnedᅠfromᅠfourᅠㅣlineᅠ22() { 
    return function returnedᅠfromᅠᐸᅠreturnedᅠfromᅠfourᅠᐳᅠㅣlineᅠ23() { 

    } 
    } 
} 

function five() { 
    return function returnedᅠfromᅠfiveᅠㅣlineᅠ30() { 
    return function returnedᅠfromᅠᐸᅠreturnedᅠfromᅠfiveᅠᐳᅠㅣlineᅠ31() { 
     return function returnedᅠfromᅠᐸᅠreturnedᅠfromᅠᐸᅠreturnedᅠfromᅠfiveᅠᐳᅠᐳᅠㅣlineᅠ32() { 
     foo('blue', function passedᅠintoᅠfooᅠㅣlineᅠ33() { 

     }) 
     } 
    } 
    } 
} 


var six = function asᅠvarᅠsixᅠㅣlineᅠ42() { 

} 


var seven = function asᅠvarᅠsevenᅠㅣlineᅠ47 (err, cb) { 

    return function returnedᅠfromᅠᐸᅠasᅠvarᅠsevenᅠᐳᅠㅣlineᅠ49() { 
    cb(function passedᅠintoᅠcbᅠㅣlineᅠ50() { 

    }) 
    } 

} 

var o = {}; 
o.eight = function asᅠpropertyᅠeightᅠㅣlineᅠ58 (cb) { } 


o.eight(function passedᅠintoᅠoːeightᅠㅣlineᅠ61() { }) 

o.eight.nine = function asᅠpropertyᅠnineᅠㅣlineᅠ63() {} 
o.eight.nine(function passedᅠintoᅠeightːnineᅠㅣlineᅠ64() { }) 

var o2; 

o2 = function asᅠvarᅠo2ᅠㅣlineᅠ68() { } 


;(function IIFEᅠㅣlineᅠ71() {}()) 

!function IIFEᅠㅣlineᅠ73() { }() 



function toodeep() { 
    return function returnedᅠfromᅠtoodeepᅠㅣlineᅠ78() { 
    return function returnedᅠfromᅠᐸᅠreturnedᅠfromᅠtoodeepᅠᐳᅠㅣlineᅠ79() { 
     return function returnedᅠfromᅠᐸᅠreturnedᅠfromᅠᐸᅠreturnedᅠfromᅠtoodeepᅠᐳᅠᐳᅠㅣlineᅠ80() { 

     return function returnedᅠfromᅠᐸᅠreturnedᅠfromᅠᐸᅠreturnedᅠfromᅠᐸᅠreturnedᅠfromᅠtoodeepᅠᐳᅠᐳᅠᐳᅠㅣlineᅠ82() { 
      return function returnedᅠfromᅠᐸᅠreturnedᅠfromᅠᐸᅠreturnedᅠfromᅠᐸᅠreturnedᅠfromᅠᐸᅠreturnedᅠfromᅠtoodeepᅠᐳᅠᐳᅠᐳᅠᐳᅠㅣlineᅠ83() { 
      return function returnedᅠfromᅠᐸᅠreturnedᅠfromᅠᐸᅠreturnedᅠfromᅠᐸᅠreturnedᅠfromᅠᐸᅠreturnedᅠfromᅠᐸᅠreturnedᅠfromᅠtoodeepᅠᐳᅠᐳᅠᐳᅠᐳᅠᐳᅠㅣlineᅠ84() { 

       return function returnedᅠfromᅠᐸᅠreturnedᅠfromᅠᐸᅠreturnedᅠfromᅠᐸᅠreturnedᅠfromᅠᐸᅠreturnedᅠfromᅠᐸᅠreturnedᅠfromᅠᐸᅠreturnedᅠfromᅠtoodeepᅠᐳᅠᐳᅠᐳᅠᐳᅠᐳᅠᐳᅠㅣlineᅠ86() { 
       return function() { 
        return function() { 

        return function() { 

        }      

        } 
       } 
       } 

      } 
      } 
     }   
     } 
    } 
    } 
} 

Mam nadzieję, że to może trochę pomóc! Twoje zdrowie!

1

Używam pm2, który jest menedżerem procesów dla node.js, a także raportowanie błędów rollbar.Myślę, że powinieneś zdefiniować niektóre dane dotyczące części kodu, z której pochodzi ten błąd.

1

Dla każdego uncaughtException serwer zatrzyma się, aby serwer działał dalej, nawet jeśli nie ma przechwyconego wyjątku, co zrobiłem, to utworzono oddzielną kolekcję do przechowywania błędów, zapisz błąd, gdy wystąpi niepobity wyjątek i zwróci.

Collection

var ErrorSchema = new mongoose.Schema({ 
    err_Message:{type:String}, 
    err_Stack:{type:String}, 
    date:{type:Date} 
}); 

Controller

process.on('uncaughtException', function (err) { 
    console.log(err); 
    console.error((new Date).toUTCString() + ' uncaughtException:', err.message); 
    console.error(err.stack); 

    var newError = new Error; 
    newError.err_Message = err.message; 
    newError.err_Stack = err.stack; 
    newError.date = moment(); 
    newError.save(function(saveErr,errData){ 
     if(!saveErr) 
      console.log('New Error is saved'); 
     else 
      console.log('Error in saving error'); 
    }); 
    //process.exit(1) 
}); 

Powyższe metody zapisuje przechwycony wyjątek w Error zbierania i procesu/serwer nie zatrzymuje.

Mam nadzieję, że to pomoże.

6

Gorąco polecam w przy użyciu Winston lub Bunyan. Wybór pakietu npm jest decyzją Twojej aplikacji.

Można porównywać dostępne pakiety npm, przechodząc przez statystyki w dostępnych na stronach npm. Statystyki są w zasadzie następujące.

  1. pliki do pobrania w ostatnim dniu
  2. pliki do pobrania w ciągu ostatniego tygodnia
  3. pliki do pobrania w ciągu ostatniego miesiąca
  4. otwartych kwestii i otwarte żądania ciągnąć.

Posiadanie większej liczby pobrań w ostatnim czasie wskaże, że istnieje duże wsparcie dla modułu, którego używasz na dłuższą metę. To ważne.

Zarówno Winstan jak i Bunyan najlepiej radzą sobie z pakowaniem pakietów npm na rynku. Główną różnicą jest to, że Winstan jest naprawdę niesamowity i elastyczny w normalnym procesie logowania. Oczywiście Winstan oferuje wiele możliwości rejestrowania. Ale jakkolwiek, aby wykorzystać te możliwości, trzeba trochę wysiłku włożyć w porównaniu z Bunyanem.

Z drugiej strony Bunyan specjalnie wspiera fakt "analizowania dzienników". Zasadniczo Bunyan służy do przetwarzania logów. Jeśli więc chcesz analizować swoje dzienniki, pliki dzienników, zdecydowanie zalecamy użycie Bunyan. Poprawianie logów z Bunyanem jest dość łatwe w stosunku do Winstana.

Przeprowadziłem dokładne porównanie Bunyana i Winstana. Proszę sprawdzić poniższy link, aby zobaczyć, w jaki sposób Winstan i Bunyan mogą korzystać w zależności od zakresu, przypadku użycia i konieczności logowania do aplikacji Node. Link: https://docs.google.com/document/d/1pD9PLyxlcHVxxOvserNLO9tAz-QA_Co-xo6cWLhLghc/edit?usp=sharing

także w środowisku Produkcji, upewnij się, aby korzystać z poziomów rejestrowania mądrze.Najczęściej stosowany poziomy rejestrowania w środowisku produkcyjnym są:

  • błąd
  • informacji
  • debug
Powiązane problemy