본관은 안동(安東). 자는 태초(太初), 호는 산목(山木)·경원(景源). 김시발(金時發)의 증손으로, 할아버지는 김교행(金敎行)이고, 아버지는 군수 김이인(金履仁)이다. 어머니는 참봉 이극현(李克顯)의 딸이다.
1783년(정조 7)에 생원이 되고, 1789년 식년 문과에 갑과로 급제, 사직서직장에 제수되었다. 같은 해 초계문신(抄啓文臣: 37세 이하에서 우수한 자를 뽑아 규장각에 소속시키고 공부하게 한 문신)에 발탁되고, 사서를 강론하였다.
1791년 부수찬·삼사를 지냈으며, 이듬해 사간으로서 이가환(李家煥)의 부당함을 상소하다 삭직당했으나, 곧 포천에 암행어사로 나가 민폐를 살폈다. 1793년 상소한 일이 말썽이 되어 파직되었다.
1796년 괴산군수와 서산군수를 지낸 뒤, 1799년 응교·부응교·세자보도 등의 임무 수행 중 영남 지방에 기근이 들어 암행어사로 다녀왔다. 그 뒤 전라도관찰사·승지를 거쳐, 1800년 이조참의가 되었다. 순조가 즉위하자 실록당상(實錄堂上)에 제수되었다.
시강원보덕·이조참판을 거쳐 1803년 영남안찰사, 1806년 호조·예조·병조·공조의 참판과 한성부서윤·이조참판·한성부판윤·대사헌 겸 홍문관제학·비변사유사당상 등을 두루 지냈다. 1809년 병조판서·이조판서, 이듬해에 호남관찰사, 1812년 광주유수·이조판서 겸 세자빈객으로 인재 등용을 고르게 하고자 노력하였다.
그러나 평소에 사감을 가졌던 전 참의 한시유(韓始裕)의 무고로 사직당하였다. 뒤에 정헌으로 승계한 뒤 종부시제조·판의금부사 등을 거쳐, 1819년 경기도관찰사로 재임 중 어머니의 3년 상을 치른 뒤 죽었다. 어릴 때부터 문사에 능했으며 경술(經術)에 조예가 깊었다. 시호는 문간(文簡)이다.