로그에서 디버깅

9715 단어 RubyRails

연설


이번에는 내가 겪은 한정된 오류, 그 처리였지만, 절차는 기본적으로 어떤 오류도 통용되어야 했다.
일지를 해독하는 것은 힘든 일이지만 시간을 들여도 할 가치가 있다.
find,find_나도 by의 공부가 될 수 있을 것 같아.
그리고 이번 기사는 제 비망록을 중심으로 타인의 이해에 조금이나마 도움이 되었으면 합니다.세심하지 않은 부분이 있지만 좀 더 볼 수 있다면 좋겠어요.

구체적인 오류 내용


개발 환경에서 정상적으로 작동하지만 생산 환경에서 오류가 발생했습니다.
Rails Tutorial 7장을 완료하고 heroku에 배치한 후 Production 환경에서 사용자가 등록한 Redirect(/users/:id)에서 오류가 발생했습니다.또한 Deverop 환경의 동작이 정상입니다.

원인 규명 방법


1. 로그 확인


터미널에서 다음 작업을 수행합니다.
$ heroku logs

2. 로그에서 오류 찾기


이 작업은 문자의 나열에서 error 문장을 찾아 디버깅하는 것이다. 힘들지만 성장을 초래할 수 있다.
그러나 문자의 나열을 봐도 힘들기 때문에 다음 명령을 실행하여 error 문장을 찾습니다.
  • command+F(검색창 열기)
  • (오류 예제)

    발견했어.ERROR이라고 쓰여있어요.(맨 아래 줄)
    ActiveRecord::StatementInvalid (PG::DatatypeMismatch: ERROR:  argument of WHERE must be type boolean, not type integer
    

    3. error 문장 해석


    힌트는 argument of WHERE must be type boolean, not type integer입니다.
    (번역) WHERE의 매개변수는 정수가 아닌 부울이어야 합니다.
    그러니까
    User Load (0.8ms)  SELECT  "users".* FROM "users" WHERE (1) LIMIT $1  [["LIMIT", 1]]
    
    WHERE()에 들어가는 매개 변수는 int형이 아닙니다!!말했어.안에 int형의 "1"이 있습니다.

    4. 로그를 거슬러 올라가서 구체적으로 어떤 코드에 오류가 있는지 찾아낸다


    여기서 로그를 살짝 거슬러 올라가세요.
    (1) GET로/users/1을 요청합니다.
    Started GET "/users/1" for 60.125.238.10 at 2021-02-01 11:17:58 +0000
    
    (2) 사용자 컨트롤러를 통해 #show.
    Processing by UsersController#show as HTML
    
    쇼 방법이 여기에 문제가 있다는 것을 알아차렸다.
    (문제 코드 예제)

    이 코드의 어디가 문제인지 이해가 된다면 나보다 낫다. 모르면 끝까지 사귀어라.

    5. 실제 코드 수정


    다소 주제에서 벗어났지만 Rails는 Active Record를 통해 SQL을 의식하지 않고 데이터베이스를 처리할 수 있습니다.쓰기만 하면 SQL로 마음대로 변환하여 데이터베이스를 조작할 수 있다.
    문제의 코드도 SQL로 변환된 것이다.
    이 예
    >> User.find_by(1)
    Traceback (most recent call last):
            1: from (irb):19
    ArgumentError (Unsupported argument type: 1 (Integer))
    
    이런 느낌이에요.그게 잘못됐네.
    예.사실 find_by 방법의 매개 변수가 틀렸습니다.
    find_by 방법은 정수를 전달하는 것이 아니라 산열을 전달하는 것임을 기억하십시오.
    정확한 호출 방법은
    User.find_by(id: "1")
      User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
    => #<User id: 1, name: "Rails Tutorial", email: "[email protected]", created_at: "2021-02-01 05:27:00", updated_at: "2021-02-01 05:27:00", password_digest: "$2a$10$auC9Flb47s9XjRGov6byfuHhZmUEw3J1AOSNu.TRAqZ...">
    
    예.산열을 매개 변수에게 건네주고 잘 돌아왔다.
    그러니까 난find_by 방법을 쓰면서 정수형을 줬는데...(´……)쿠센
    정확한 코드는 다음과 같다.

    겸사겸사 정수형을 전달하려면find방법을 사용하세요.
    >> User.find(1)
      User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
    => #<User id: 1, name: "Rails Tutorial", email: "[email protected]", created_at: "2021-02-01 05:27:00", updated_at: "2021-02-01 05:27:00", password_digest: "$2a$10$auC9Flb47s9XjRGov6byfuHhZmUEw3J1AOSNu.TRAqZ...">
    
    예.잘 돌아왔네.
    find 방법을 쓸 때의 코드는 다음과 같습니다.

    총결산


    이번 오류는find_by의 사용 방법에 문제가 있습니다.이 디버깅 방법은 나의 선배에 해당하는 사람에게서 배운 방법이다.정말 감사합니다.로그 디버깅은 기본 중의 기본이기 때문에 처음에는 귀찮고 싫었지만 시간이 걸려도 착실하게 하면 성장할 수 있을 것 같았다.
    끝까지 함께 해줘서 고마워요.

    좋은 웹페이지 즐겨찾기