본관은 길안(吉安). 자는 원질(元質).
1360년(공민왕 9) 과거에 급제, 개성참군(開城參軍)이 되었다. 이듬해 홍건적이 침입하자 병법에 밝아 원수 김득배(金得培)의 막하로 활약하였다.
공민왕이 남천(南遷)했을 때, 역사책과 전교제향(典校祭享)의 의범(儀範) 등을 땅에 묻어 적을 평정한 뒤 발굴함으로써 그 일부를 보존하였다. 1363년 서장관(書狀官)으로서 이공수(李公遂)를 따라 원나라에 갔다.
당시 충선왕의 서자인 덕흥군(德興君)이 왕위를 탐내어 원나라 순제(順帝)에게 고려왕이 홍건적에게 죽었다고 거짓으로 고해 순제는 덕흥군으로 왕을 삼고자 하였다. 이에 이공수와 더불어 왕이 무사하다는 사실을 알리고 덕흥군파의 협박과 유혹을 끝내 물리쳤다.
이듬해 귀국하자 그 공으로 중서사인(中書舍人)에 올라 정심론상(正心論相) 20개조를 상소하였다. 그 뒤 전의부령(典儀副令)이 되어서는 왕의 명령으로 시정(時政)의 득실에 대한 10여 가지 사항을 진술하였고, 이로 인해 왕의 신망을 얻어 전의령(典儀令)으로 승진하였다.
한편, 하남왕(河南王)의 사자 곽영석(郭永錫)이 왔을 때는 관반(館伴: 외국 사신의 영접·접대를 맡는 임시 관직)으로 나아가 일을 잘 처리하였다. 1367년 제주선무사로 나갔는데, 이전 관리들과는 달리 조금도 민폐를 끼치지 않아 많은 칭송을 받았다.
이어 성균좨주에 전직해 성균관을 오경사서(五經四書)의 재(齋)로 나누고, 과거는 중국의 수검통고법(搜檢通考法)을 따르도록 건의하였다. 대사성 판전교사(大司成判典校事)로 승진한 뒤, 1367년에는 신돈(辛旽)에게 발탁되어 차자방지인(箚子房知印)이 되었다.
신돈에게 전민쟁송(田民爭訟)을 처리할 기관을 세우도록 건의해 추정도감(推整都監)을 설립하자, 그 사(使)가 되어 많은 쟁송을 처단하였다.
1375년(우왕 1) 이인임(李仁任)이 북원(北元)과 국교를 맺으려고 꾀하자, 좌대언으로 있으면서 박상충(朴尙衷) 등과 반대하였다. 그로 인하여 대간의 탄핵을 받아 길안에 유배되고, 그 뒤 무안으로 옮겨가는 도중에 죽었다.